如何使用Python csv模块读取包含不同分隔符的文件?

时间:2014-08-22 01:04:33

标签: python csv

输入:

A    B    C
D    E    F

此文件不是以制表符分隔的,一些条目以空格分隔,看起来像是制表符分隔的(这很烦人)。我尝试使用csv模块使用标准制表符分隔选项读取文件,希望它不会介意一些空格(不用说,我的输出因此代码而变得粗糙):

with open('file.txt') as f:
    input = csv.reader(f, delimiter='\t')
    for row in input:
        print row

然后我尝试用csv.reader('\t'.join(f.split()))替换第二行以尝试利用Remove whitespace in Python using string.whitespace,但我的错误是:AttributeError: 'file' object has no attribute 'split'

我也试过检查Can I import a CSV file and automatically infer the delimiter?但是这里OP导入了以分号分隔或逗号分隔的文件,但不是一个随机混合使用两种分隔符的文件。

想知道csv模块是否可以处理带有各种分隔符的文件中的读取,或者我是否应该尝试不同的方法(例如,不使用csv模块)?

我希望有一种方法可以读取带有分隔符混合的文件,并自动将此文件转换为制表符分隔文件。

3 个答案:

答案 0 :(得分:6)

只需使用.split():

csv='''\
A\tB\tC
D    E    F
'''

data=[]
for line in csv.splitlines():
    data.append(line.split())

print data 
# [['A', 'B', 'C'], ['D', 'E', 'F']]

或者,更简洁:

>>> [line.split() for line in csv.splitlines()]  
[['A', 'B', 'C'], ['D', 'E', 'F']]

对于文件,例如:

with open(fn, 'r') as fin:
    data=[line.split() for line in fin]

它的工作原理是因为str.split()将在数据元素之间的所有空格上分割,即使多于1个空白字符或混合:

>>> '1\t\t\t2     3\t  \t  \t4'.split()
['1', '2', '3', '4']

答案 1 :(得分:0)

为什么不只是滚动自己的拆分器而不是CSV模块?

delimeters = [',', ' ', '\t']

unique = '[**This is a unique delimeter**]'

with open(fileName) as f:
    for l in f: 
        for d in delimeters: l = unique.join(l.split(d))
        row = l.split(unique)

答案 2 :(得分:0)

.split()是一个简单而又好的解决方案,适用于连续,任意混合的标签和空白作为一个分隔符的情况&#34 ;;但是,当带有空白的值(由引号标记括起)出现时,这不起作用。

首先,我们可以用一个空白' '替换文本文件中的每个标签;这可以将情况简化为连续的,任意数量的空白作为一个分隔符"。
在文件上替换模式有一个很好的例子: https://www.safaribooksonline.com/library/view/python-cookbook/0596001673/ch04s04.html
注1:请勿替换为''(空字符串),因为可能有分隔符包含ONLY标签。
注2:当您在引号旁边的值中包含制表符( / t )时,此方法不起作用。

然后我们可以使用Python的csv模块,分隔符为' '(一个空白),并使用skipinitialspace=True忽略连续的空格。