2016-10-04 228 views
1

我在刪除包含一列中的字符串的文本文件中的行時遇到問題。到目前爲止,我的代碼無法刪除該行,但它能夠讀取文本文件並將其作爲CSV文件保存到不同的列中。但行不會被刪除。刪除一行,如果它包含CSV文件中的字符串

這是該列中的值的樣子:

Ship To or Bill To 
------------------ 
3000000092-BILL_TO 
3000000092-SHIP_TO 
3000004000_SHIP_TO-INAC-EIM 

而且有20多列,加50,000K行。所以基本上我試圖刪除全部包含字符串'INAC''EIM'的行。

import csv 

my_file_name = "NVG.txt" 
cleaned_file = "cleanNVG.csv" 
remove_words = ['INAC','EIM'] 

with open(my_file_name, 'r', newline='') as infile, \ 
    open(cleaned_file, 'w',newline='') as outfile: 
    writer = csv.writer(outfile) 
    for line in csv.reader(infile, delimiter='|'): 
     if not any(remove_word in line for remove_word in remove_words): 
      writer.writerow(line) 

回答

1

這裏的問題是,csv.reader對象返回文件的行作爲單個列值的列表,因此「in」測試正在檢查該列表中的任何單個值是否等於remove_word

速戰速決將嘗試

 if not any(remove_word in element for element in line for remove_word in remove_words): 

,因爲如果在該行任何字段包含任何remove_words的,這將是真實的。

+0

謝謝你爲我工作。 – Cesar

1

通過CSV閱讀每一輸出線是一個字符串列表,而不是一個字符串,所以你的列表理解是檢查是否「INAC」或「EIM」是列表的成員之一,即:

'INAC' in ['3000004000_SHIP_TO-INAC-EIM', ...] 

由於'in'在列表中調用時會查找完全匹配,因此這總是錯誤的。如果要檢查字符串是否存在於任何地方行,你並不需要一個CSV閱讀器,而是可以使用普通的open():

import csv 

my_file_name = "NVG.txt" 
cleaned_file = "cleanNVG.csv" 
remove_words = ['INAC','EIM'] 

with open(my_file_name, 'r', newline='') as infile, open(cleaned_file, 'w',newline='') as outfile: 
    writer = csv.writer(outfile) 
    for line in infile: 
     if not any(remove_word in line for remove_word in remove_words): 
      writer.writerow(line) 
+0

哦沒關係,但我仍然需要分隔符「|」因爲所有的列都被這個值分開。我將如何包括這一點? – Cesar

+0

我不確定我是否理解你的問題,如果字符串出現在行中的任何位置,或者只是刪除行內的特定列,並且保持其餘列未更改,是否嘗試刪除整行? –

+0

如果字符串出現在行的任何位置,請刪除整行。 – Cesar

1

至於其他的答案已經指出的那樣,你的代碼不起作用的原因是因爲每個line in csv.reader實際上是列值的列表,所以remove_word in line檢查,看其中是否是正好等於remove_words之一 - 這顯然從來沒有True

如果您只需要檢查一列中的單詞,沒有理由檢查所有單詞。以下內容只會檢查一列的值,因此應該比檢查文件每一行中的所有20個或更多的值要快得多。

import csv 

my_file_name = "NVG.txt" 
cleaned_file_name = "cleanNVG.csv" 
ONE_COLUMN = 1 
remove_words = ['INAC', 'EIM'] 

with open(my_file_name, 'r', newline='') as infile, \ 
    open(cleaned_file_name, 'w',newline='') as outfile: 
    writer = csv.writer(outfile) 
    for row in csv.reader(infile, delimiter='|'): 
     column = row[ONE_COLUMN] 
     if not any(remove_word in column for remove_word in remove_words): 
      writer.writerow(row) 
相關問題