输入:
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
模块)?
我希望有一种方法可以读取带有分隔符混合的文件,并自动将此文件转换为制表符分隔文件。
答案 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
忽略连续的空格。