簡體   English   中英

在txt中查找分隔符以使用Python轉換為csv

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM