我有一個包含逗號和雙引號的csv文件。但是,雙引號只有在字符串內有逗號時才使用。就像這樣:CSV文件中的逗號和雙引號
AAA, BBB, "ACB,BCA", 123, "1,987"
DDC, CHA, ACH;HDC, "2,34", 192
我不想解析逗號雙引號,並想有以下輸出:
x1 x2 x3 x4 x5
AAA BBB ACB,BCA 123 1,987
DDC CHA ACH;HDC 2,34 192
總之,忽略逗號與雙值引號並考慮不帶雙引號的值的逗號。
我使用這多個CSV文件合併成一個CSV文件,同時增加了一些列指的是文件名:
with open(outfile, "wb") as outfile:
writer = None
for input_filename in filenames:
with open(input_filename, "rb") as infile:
reader = csv.DictReader(infile, quotechar='"', delimiter=',')
if writer is None:
field_names = ["index1"] + ["index2"] + reader.fieldnames
writer = csv.DictWriter(outfile, field_names)
writer.writeheader()
for row in reader:
row["index1"] = input_filename[1:10]
row["index2"] = input_filename[10:20]
writer.writerow(row)
我閱讀的CSV的具體方案是:
csv.DictReader(infile, quotechar='"', delimiter=',')
但這顯然不起作用。
有什麼建議嗎?
編輯:下面一個更好的例子:
我試圖打開CSV文件的結構是這樣的:
x 1,x 2,x 3,x 4,x5 AAA, 「BB,B」, CCC, DDD, EEE AA1, B;B2, CC3, DD4, EE5
我已經試過解析器到目前爲止,csv.DictReader,PD .read_csv或csv.reader似乎讀取「;」在B中; B2作爲行斷路器,它混淆了以下所有的列。
下面的代碼解決了「BB,B」的問題,但仍打破了B; B2到一個新行
csv.reader(fileObject, quotechar='"', delimiter=',',
quoting=csv.QUOTE_ALL, skipinitialspace=True)
* - 不是嗎?它做什麼呢? 'DictReader'需要頭文件,你有沒有試過提供這些頭文件?否則,你只會得到一行,'{'AAA':'DDC',''ACB':'ACH; HDC','987'':無,'BBB':'CHA','BCA'': ''2','123':'34''','1':'192'}'。 – jonrsharpe
我認爲fieldname對讀者來說是可選的,但是在我寫的時候,它將大多數情況放到了正確的列中。除了在x3欄中的那些。它適用於x3中的「ACB,BCA」,但在看到ACH時跳躍到行; HDC。 – tan
如果第一行是標題,則它是可選的;在您的示例中,您沒有顯示它。給出一個[mcve];例如,只是打印讀取的行可能就足夠了,而不顯示輸出寫入器的細節。 – jonrsharpe