[英]Find delimiter in txt to convert to csv using Python
我必須將一些 txt 文件轉換為 csv(並在轉換過程中進行一些操作)。
我使用 csv.Sniffer() 類來檢測 txt 中使用的分隔符
這段代碼
with open(filename_input, 'r') as f1, open(filename_output, 'wb') as f2:
dialect = csv.Sniffer().sniff(f1.read(1024)) #### detect delimiters
f1.seek(0)
r=csv.reader(f1, delimiter=dialect )
writer = csv.writer(f2,delimiter=';')
返回:錯誤:無法確定分隔符
這項工作
with open(filename_input, 'r') as f1, open(filename_output, 'wb') as f2:
#dialect = csv.Sniffer().sniff(f1.read(1024)) #### detect delimiters
#f1.seek(0)
r=csv.reader(f1, delimiter='\t' )
writer = csv.writer(f2,delimiter=';')
或者
with open(filename_input, 'r') as f1, open(filename_output, 'wb') as f2:
#dialect = csv.Sniffer().sniff(f1.read(1024)) #### detect delimiters
#f1.seek(0)
r=csv.reader(f1, dialect="excel-tab")
writer = csv.writer(f2,delimiter=';')
這是一個 txt 行示例(10 條記錄由 Tab 分隔)
166 14908941 sa_s NOVA i 7.05 DEa 7.17 Ncava - Deo mo 7161 4,97
為什么 csv.Sniffer() 類不起作用?
該錯誤僅讀取 1024 字節來解析整個 txt(也許這不足以檢測分隔符)。 現在此代碼無需其他編輯即可工作:
with open(filename_input, 'r') as f1, open(filename_output, 'wb') as f2:
dialect = csv.Sniffer().sniff(f1.read()) #### error with dialect = csv.Sniffer().sniff(f1.read(1024))
f1.seek(0)
r=csv.reader(f1, delimiter=dialect )
writer = csv.writer(f2,delimiter=';')
您必須使用dialect.delimiter
而不是dialect
因為返回的是類 Dialect 類型,並且您需要它的屬性Dialect.delimiter
rows=csv.reader(f1, delimiter=dialect.delimiter)
修改后的代碼如下
import csv
filename_input = 'filein.txt'
filename_output = 'fileout.csv'
with open(filename_input, 'r') as f1, open(filename_output, 'wb') as f2:
dialect = csv.Sniffer().sniff(f1.read(1024), "\t") #### detect delimiters
f1.seek(0)
print(dialect.delimiter)
rows=csv.reader(f1, delimiter=dialect.delimiter)
writer = csv.writer(f2,delimiter=';')
writer.writerows(rows)
輸出:
C:\\pyp>python.exe txttocsv.py
,
C:\\pyp>
另請注意,來自 doc :
嗅探(樣本,分隔符=無)
分析給定的樣本並返回一個反映找到的參數的方言子類。 如果給出了可選的分隔符參數,則將其解釋為包含可能的有效分隔符的字符串。
因此,如果您想在文本文件中找到的分隔符類似於#
而不是,
或;
那么你應該在sniff
函數中提到它作為第二個參數,如下所示:
dialect = csv.Sniffer().sniff(f1.read(1024), '#')
更新:要讀取整個文件,您將需要
dialect = csv.Sniffer().sniff(f1.read())
該代碼有效,但在生成的 CSV 中,每條記錄都跳過一行。
我使用的代碼:-
import csv
filename_input = r'filepath.txt'
filename_output = r'filepath.csv'
with open(filename_input, 'r') as tmp, open(filename_output, 'w') as tmp2:
dialect = csv.Sniffer().sniff(tmp.read(1024), ";") #### detect delimiters
tmp.seek(0)
print(dialect.delimiter)
rows=csv.reader(tmp, delimiter=dialect.delimiter)
writer = csv.writer(tmp2,delimiter=',')
writer.writerows(rows)
輸入:-
輸出:-
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.