2013-03-12 49 views
-1

這是python腳本:如何使用python處理CSV列中的雙引號?

f = open('csvdata.csv','rb') 
fo = open('out6.csv','wb') 

for line in f: 
    bits = line.split(',') 
    bits[1] = '"input"' 
    fo.write(','.join(bits)) 

f.close() 
fo.close() 

我有一個CSV文件,我用替換字符串「輸入」的第二列的內容。但是,我需要首先從該列內容中獲取一些信息。

內容可能是這樣的:

failurelog_wl","inputfile/source/XXXXXXXX"; "**X_CORD2**"; "Invoice_2M"; 
"**Y_CORD42**"; "SIZE_ID37"" 

它具有不可思議的數據類型,你可以看到,特別是它有2個雙引號在該行,而不只是一個,你會期望結束。

在替換列值之前,我需要提取XCORDYCORD信息,如XCORD = 2YCORD = 42。然後我想插入一個名爲X_Y的額外列,它代表(2_42)

如何修改我的腳本來做到這一點?

+2

你知道,Python有一個'csv'模塊可以使用。 – squiguy 2013-03-12 07:05:01

+0

我不知道如何從第二欄內容中獲取信息。它有奇怪的數據類型。 – user2159674 2013-03-12 07:08:30

+0

我上面展示的例子是第二列內容數據。 – user2159674 2013-03-12 07:15:27

回答

1

如果我正確理解你的問題,你可以使用一個簡單的正則表達式拔出你想要的數字:

import re 

f = open('csvdata.csv','rb') 
fo = open('out6.csv','wb') 

for line in f: 
    bits = line.split(',') 

    x_y_matches = re.match('.*X_CORD(\d+).*Y_CORD(\d+).*', bits[1]) 
    assert x_y_matches is not None, 'Line had unexpected format: {0}'.format(bits[1]) 
    x_y = '({0}_{1})'.format(x_y_matches.group(1), x_y_matches.group(2)) 

    bits[1] = '"input"' 
    bits.append(x_y) 

    fo.write(','.join(bits)) 

f.close() 
fo.close() 

請注意,這隻會工作,如果第2列總是「X_CORD」和「Y_CORD說'在數字之前。如果它有時是一種稍微不同的格式,則需要調整正則表達式以適應這種情況。如果發生這種情況,我添加了assert以提供更有用的錯誤消息。

您提到希望該列被命名爲X_Y。你的腳本似乎假定沒有標題,我的修改版本肯定會做出這個假設。同樣,如果存在標題行,則需要進行調整。

而且,是的,我同意其他評論者的意見,即使用csv模塊,讀寫csv文件通常會更清潔。

+0

我有一個標題....我想要X_Y作爲一個新的列,或者我可以只替換第二列的內容而不是添加新列 – user2159674 2013-03-12 09:40:25

相關問題