使用Python将制表符分隔的txt文件转换为csv文件

使用Python将制表符分隔的txt文件转换为csv文件,python,csv,text-files,Python,Csv,Text Files,因此,我想将一个简单的以制表符分隔的文本文件转换为csv文件。如果使用string.split('\n')将txt文件转换为字符串,则会得到一个列表,其中每个列表项都是一个字符串,每个列之间都有'\t'。我想我可以用逗号替换“\t”,但它不会将列表中的字符串视为字符串,并允许我使用string.replace。这是我的代码的开头,它仍然需要一种方法来解析选项卡“\t” csv支持制表符分隔的文件。提供: 为什么在使用csv模块读取文件时应始终使用“rb”模式: Python 2.7.2 (def

因此,我想将一个简单的以制表符分隔的文本文件转换为csv文件。如果使用string.split('\n')将txt文件转换为字符串,则会得到一个列表,其中每个列表项都是一个字符串,每个列之间都有'\t'。我想我可以用逗号替换“\t”,但它不会将列表中的字符串视为字符串,并允许我使用string.replace。这是我的代码的开头,它仍然需要一种方法来解析选项卡“\t”


csv
支持制表符分隔的文件。提供:


为什么在使用
csv
模块读取文件时应始终使用“rb”模式:

Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
示例文件中有什么:任何旧的垃圾,包括从数据库中提取blob或任何东西获得的控制字符,或者在Excel公式中不小心使用
CHAR
函数,或者

>>> open('demo.txt', 'rb').read()
'h1\t"h2a\nh2b"\th3\r\nx1\t"x2a\r\nx2b"\tx3\r\ny1\ty2a\x1ay2b\ty3\r\n'
Python在以文本模式读取文件时遵循CP/M、MS-DOS和Windows:
\r\n
被识别为行分隔符,用作
\n
,而
\x1a
又称Ctrl-Z被识别为文件结束标记

>>> open('demo.txt', 'r').read()
'h1\t"h2a\nh2b"\th3\nx1\t"x2a\nx2b"\tx3\ny1\ty2a' # WHOOPS
使用“rb”打开文件的csv按预期工作:

>>> import csv
>>> list(csv.reader(open('demo.txt', 'rb'), delimiter='\t'))
[['h1', 'h2a\nh2b', 'h3'], ['x1', 'x2a\r\nx2b', 'x3'], ['y1', 'y2a\x1ay2b', 'y3']]
但文本模式不能:

>>> list(csv.reader(open('demo.txt', 'r'), delimiter='\t'))
[['h1', 'h2a\nh2b', 'h3'], ['x1', 'x2a\nx2b', 'x3'], ['y1', 'y2a']]
>>>
我就是这样做的

import csv

with open(txtfile, 'r') as infile, open(csvfile, 'w') as outfile:
     stripped = (line.strip() for line in infile)
     lines = (line.split(",") for line in stripped if line)
     writer = csv.writer(outfile)
     writer.writerows(lines)

-1您假定OP在Python2.x上;在这种情况下,输入文件应以“rb”模式打开。还不能确保至少关闭输出文件,最好是关闭两个文件。bikeshedding。脚本一终止,两个文件都将立即关闭。那就是。。马上+1.@JohnMachin我什么都没料到。为了演示如何转换文件,我做了尽可能少的更改<如果程序将立即终止,则不需要使用进行编码,文件将被关闭。我添加了一条注释,表示如果它是一个长时间运行的程序,应该小心。这与保留行尾无关。阅读Python 2.7和3.2的csv.reader文档。另请参见“这两种模式之间的唯一区别是如何在Windows上处理换行符。”:错误;看看我的答案。“文件编码与ASCII兼容”应该是什么意思?在任何情况下,我的答案中的示例数据文件都是用ASCII编码的。您是否有关于Ctrl-z行为的python.org引用?我看不到有任何提及。@agf:没有。这是CPython 2.X授权负责决定对目标编译器的
C
stdio
库执行什么操作的结果。
>>> list(csv.reader(open('demo.txt', 'r'), delimiter='\t'))
[['h1', 'h2a\nh2b', 'h3'], ['x1', 'x2a\nx2b', 'x3'], ['y1', 'y2a']]
>>>
import csv

with open(txtfile, 'r') as infile, open(csvfile, 'w') as outfile:
     stripped = (line.strip() for line in infile)
     lines = (line.split(",") for line in stripped if line)
     writer = csv.writer(outfile)
     writer.writerows(lines)