如何使用python csv模块拆分双管分隔数据

时间:2011-06-15 02:35:17

标签: python csv delimiter

我的数据看起来像是:

"1234"||"abcd"||"a1s1"

我正在尝试使用Python的csv阅读器和编写器进行读写。 由于csv模块的分隔符仅限于单个字符,是否有任何方法可以干净地检索数据?我无法删除空列,因为它是一个庞大的数据集,需要以时间限制的方式处理。任何想法都会有所帮助。

4 个答案:

答案 0 :(得分:13)

The docs并且实验证明只允许使用单字符分隔符。

由于cvs.reader接受任何支持迭代器协议的对象,您可以使用生成器语法将|| - s替换为| - s,然后将此生成器提供给读者:< / p>

def read_this_funky_csv(source):
  # be sure to pass a source object that supports
  # iteration (e.g. a file object, or a list of csv text lines)
  return csv.reader((line.replace('||', '|') for line in source), delimiter='|')

此代码非常有效,因为它一次只能在一行CSV行上运行,只要您的CSV源产生的行数不超过可用RAM:)

答案 1 :(得分:2)

>>> import csv
>>> reader = csv.reader(['"1234"||"abcd"||"a1s1"'], delimiter='|')
>>> for row in reader:
...     assert not ''.join(row[1::2])
...     row = row[0::2]
...     print row
...
['1234', 'abcd', 'a1s1']
>>>

答案 2 :(得分:1)

不幸的是,分隔符由C中的字符表示。这意味着它不可能是Python中的单个字符以外的任何字符。好消息是可以忽略null的值:

reader = csv.reader(['"1234"||"abcd"||"a1s1"'], delimiter='|')
#iterate through the reader.
for x in reader:
    #you have to use a numeric range here to ensure that you eliminate the 
    #right things.
    for i in range(len(x)):
        #Odd indexes will be discarded.
        if i%2 == 0: x[i] #x[i] where i%2 == 0 represents the values you want.

还有其他方法可以实现这一点(可以为一个函数编写一个函数),但这会为您提供所需的逻辑。

答案 3 :(得分:1)

如果您的数据看起来像示例(字段永远不会包含'||'并且始终引用),并且您可以容忍引号,或者愿意稍后将它们分开,只需使用.split

>>> '"1234"||"abcd"||"a1s1"'.split('||')
['"1234"', '"abcd"', '"a1s1"']
>>> list(s[1:-1] for s in '"1234"||"abcd"||"a1s1"'.split('||'))
['1234', 'abcd', 'a1s1']

只有在字段中找到分隔符或删除字段周围的可选引号时才需要csv