我必须将一些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=';')
Run Code Online (Sandbox Code Playgroud)
返回:错误:无法确定分隔符
这项工作
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=';')
Run Code Online (Sandbox Code Playgroud)
要么
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=';')
Run Code Online (Sandbox Code Playgroud)
这是一个txt行示例(由Tab分隔的10条记录)
166 14908941 sa_s NOVA i 7.05 DEa 7.17 Ncava - Deo mo 7161 4,97
Run Code Online (Sandbox Code Playgroud)
为什么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=';')
Run Code Online (Sandbox Code Playgroud)
小智 5
您必须使用dialect.delimiter而不是仅仅dialect因为返回的是类Dialect类型,并且需要它的属性 Dialect.delimiter
rows=csv.reader(f1, delimiter=dialect.delimiter)
Run Code Online (Sandbox Code Playgroud)
修改后的代码如下
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)
Run Code Online (Sandbox Code Playgroud)
输出:
C:\ pyp> python.exe txttocsv.py
,
C:\ pyp>
另请注意,来自doc:
嗅探(样本,分隔符=无)
分析给定的样本并返回反映所找到参数的方言子类。如果给出了可选的定界符参数,则将其解释为包含可能的有效定界符字符的字符串。
因此,如果要在文本文件中找到的分隔符#不是,或;,则应在sniff函数中将其作为第二个参数提及,如下所示:
dialect = csv.Sniffer().sniff(f1.read(1024), '#')
Run Code Online (Sandbox Code Playgroud)
更新:要读取整个文件,您将需要
dialect = csv.Sniffer().sniff(f1.read())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5291 次 |
| 最近记录: |