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

在txt中查找分隔符以使用Python转换为csv,python,csv,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

我必须将一些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=';')

这是一个txt行示例(由制表符分隔的10条记录)

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

您必须使用
方言.delimiter
而不仅仅是
方言
,因为返回的是类方言类型,您需要它的
方言.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>

还请注意:

嗅探(示例,分隔符=无)

分析给定的样本并返回一个方言子类 找到的参数。如果给定了可选的delimiters参数, 它被解释为包含可能的有效分隔符的字符串 人物

因此,如果要在文本文件中找到的分隔符类似于
,而不是
然后您应该提到,在
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)
输入:-

输出:-


以及
csv.excel\u tab()返回的
方言是什么?如果你的代码能正常工作,那么我就不能真正理解这个问题,因为我很好奇。很抱歉,我犯了一个错误,它是
csv.Sniffer().sniff(f1.read(1024))
方言=csv.Sniffer().sniff(f1.read(1024))
首先返回打印错误,然后
方言=csv.Sniffer().sniff(f1.read)(1024),“\t”)
return error to您使用的是哪个版本的python?对于python3,您需要将print语句作为
print(dialent.delimiter)
@user2418290,您必须发布错误。否则就不清楚你的意思了?Python2.7。错误是相同的:“无法确定分隔符”我可以发送所有的txt文件吗?通过电子邮件?
dialect = csv.Sniffer().sniff(f1.read()) 
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)