2015-01-05 199 views
-1

的一部分,我有一個CSV文件,如下圖所示:替換Python列表元素

CSV:

H1,H2,H3 
A_B,C1,D 
F_2j,G,p5 

我想從第一列中刪除「_」和數字。這是我試過的

for i in range(len(max(cols, key=len))): 
     transposed = ([(c[i] if i<len(c) else '') for c in cols]) 
     str(transposed[0]).replace("_",";").split() 

它確實取代'_',但原來的轉置仍然打印相同的csv文件。我怎樣才能用舊的替換這個新的列?另外,如何從列1中刪除數字以提供以下輸出?

所需的輸出:

H1,H2,H3 
A;B,C1,D 
F;j,G,p5 
+0

你只是想輸出或寫入另一個文件? – Hackaholic

+0

@Hackaholic我只是想要輸出,因爲在這之後我會做更多的處理。 – abn

回答

1
import csv 
import re 

with open("in.csv") as f, open("out.csv", "w") as out: 
    out.write(next(f)) 
    r = csv.reader(f, delimiter=",") 
    for row in r: 
     out.write("{},{}\n".format(re.sub("_\d+|[_\d+]", ";",row[0]), ",".join(row[1:]))) 
+0

bro爲什麼不是使用_ \ d * – Hackaholic

+0

@Hackaholic,因爲這不會在'F2j' –

+0

okie你也採取了其他的可能性,但它不是輸入,但它很好:) – Hackaholic

1

你可以試試這個:

import re 
with open('file.csv') as f: 
    for x in f: 
     print re.sub("_\d*",';',x) # here you can store it in variable and do procession on it 

輸出:

H1,H2,H3 
A;B,C1,D 
F;j,G,p5 
+0

@PadraicCunningham我檢查了它,它的工作正常,它劑量效應標題 – Hackaholic

2

問題可能是replace行爲的基本誤解 - 它返回修改後的字符串的副本,但不會就地修改字符串。要取代「取」,您必須將其分配回原始字符串。考慮以下幾點:

>>> text = 'blah_blah_blah' 
>>> print(text.replace('_', ';')) 
blah;blah;blah 
>>> print(text) 
blah_blah_blah 

正如你可以看到,原來text串是由replace電話不變。要真正修改:

>>> text = text.replace('_', ';') 
>>> print(text) 
blah;blah;blah 

對於消除數字,你可以用基於正則表達式的方法去從@Hackaholic答案(這將很好地處理「_」到「;」轉化爲好) - 我只是認爲在闡明字符串的行爲方式方面會有好處。

+0

@謝謝你。但是,當我有多列時,它會工作,我只想編輯column1,因爲這樣它會替換'文本'中的所有_,並再次將其分配給'文本'。 – abn

+0

@dan,你不能用正常的str.replace來做你想做的事 –

+0

@PadraicCunningham你的刪除答案適合我。謝謝。我可能沒有正確說出我的問題,但這正是我需要的。 – abn

1

我建議使用Python's CSV Module來讀寫。這最終可能會簡化許多已有的邏輯。確保你實際上是將行寫入一個文件(我沒有看到你的代碼示例)。我也建議使用正則表達式的替換和刪除:

sub = re.sub("_\d*", ";", my_column) 
# use sub as your new column 

編輯:我看錯什麼OP想就數字去除。關於什麼時候擦除數字的規則是不明確的(只有在_字符之後?所有數字如果有_?)。使用OP的示例輸出作爲規則(「_之後的所有數字」)

+0

如果只有一個數字,它將有效地清空CSV文件中的單元格。所以,如果我的排是「一,二,三」,我會得到「二,三」。這是有效的,只是意味着第一個單元格是空的 – wilkesybear

+0

這是真的,我沒有看到數字刪除依賴於「_」。關於何時刪除數字的規則是模棱兩可的,但如果我們在「_」之後直接假設數字,那麼應該像其他人所說的那樣在一個「sub」調用中完成:「_ \ d *」 – wilkesybear