在txt中查找分隔符以使用Python转换为csv

时间:2014-01-28 14:16:42

标签: python csv

我必须将一些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行示例(由Tab分隔的10条记录)

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=';')

2 个答案:

答案 0 :(得分:4)

您必须使用dialect.delimiter而不仅仅是dialect,因为返回的内容是类型Dialect,您需要attribute 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>

另请注意from doc

  

嗅(样本,分隔符=无)

     

分析给定的样本并返回反映的Dialect子类   找到的参数。如果给出了可选的delimiters参数,   它被解释为包含可能的有效分隔符的字符串   字符。

因此,如果要在文本文件中找到的分隔符类似于#而不是,;,那么您应该在sniff函数中提及像这样的第二个参数:

dialect = csv.Sniffer().sniff(f1.read(1024), '#') 

更新:要阅读整个文件,您需要

dialect = csv.Sniffer().sniff(f1.read()) 

答案 1 :(得分:0)

该代码有效,但是在生成的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)

输入:-

Input

输出:-

enter image description here