Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PythonCSV模块以混合的不同分隔符读入文件?_Python_Csv - Fatal编程技术网

如何使用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)