如何使用PythonCSV模块以混合的不同分隔符读入文件?
输入: 该文件不是以制表符分隔的,有些条目以空格分隔,看起来像是以制表符分隔的(这很烦人)。我尝试使用如何使用PythonCSV模块以混合的不同分隔符读入文件?,python,csv,Python,Csv,输入: 该文件不是以制表符分隔的,有些条目以空格分隔,看起来像是以制表符分隔的(这很烦人)。我尝试使用csv模块使用规范的制表符分隔选项读取文件,希望它不会介意一些空格(不用说,我的输出结果与此代码不符): 然后,我尝试将第二行替换为csv.reader('\t'.join(f.split()),试图利用它,但我的错误是:AttributeError:'file'对象没有属性“split” 我也尝试过检查,但这里OP导入了分号分隔或逗号分隔的文件,但不是一个随机混合了这两种分隔符的文件 想知道c
csv
模块使用规范的制表符分隔选项读取文件,希望它不会介意一些空格(不用说,我的输出结果与此代码不符):
然后,我尝试将第二行替换为csv.reader('\t'.join(f.split())
,试图利用它,但我的错误是:AttributeError:'file'对象没有属性“split”
我也尝试过检查,但这里OP导入了分号分隔或逗号分隔的文件,但不是一个随机混合了这两种分隔符的文件
想知道csv
模块是否可以处理混合使用各种分隔符的文件读取,或者我是否应该尝试不同的方法(例如,不使用csv
模块)
我希望有一种方法可以读入一个混合了分隔符的文件,并自动将该文件转换为制表符分隔的文件。只需使用.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']]
它之所以有效,是因为它将在数据元素之间分割所有空格,即使有超过1个空格字符或混合:
with open(fn, 'r') as fin:
data=[line.split() for line in fin]
为什么不推出自己的拆分器而不是CSV模块
>>> '1\t\t\t2 3\t \t \t4'.split()
['1', '2', '3', '4']
.split()对于“连续、任意混合的制表符和空格作为一个分隔符”的情况是一个简单而好的解决方案;但是,当显示带空白的值(用引号括起来)时,这不起作用
首先,我们可以将文本文件中的每个选项卡替换为一个空白的'
;这可以将情况简化为“连续、任意数量的空格作为一个分隔符”。在文件上替换图案有一个很好的示例:
注意1:不要替换为
”
(空字符串),因为可能有一个分隔符只包含制表符。注意2:如果在引号括起的值中有制表符(/t),则此方法不起作用
然后,我们可以使用Python的csv模块,分隔符为
”
(一个空格),并使用skipinitialspace=True
忽略连续空格。您的空格分隔行是否总是用相同数量的空格分隔?我认为最好是规范化您的文件,然后对其进行处理,我同意,但如果文件长达数百行,我将如何规范化/处理它?也许有一个更好的方法来替代csv
模块?任何带引号的字段:a不要打断B“
?@dawg:文件字段中没有引号。+1和公认的答案,用于说明如何使用完成拆分()
您希望的csv
模块可以轻松完成。如果值中有空格(例如,字符串用引号字符隔开),则此方法将失败。
with open(fn, 'r') as fin:
data=[line.split() for line in fin]
>>> '1\t\t\t2 3\t \t \t4'.split()
['1', '2', '3', '4']
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)