如何使用python csv模块分割双管道定界数据

|| 我有看起来像的数据:
\"1234\"||\"abcd\"||\"a1s1\"
我正在尝试使用Python的csv读写器进行读写。 由于CSV模块的分隔符仅限于单个字符,是否有任何方法可以干净地检索数据?我无法删除空列,因为它是一个庞大的数据集,需要按时间限制进行​​处理。任何想法都会有所帮助。     
已邀请:
        文档和实验证明,仅允许使用单字符定界符。 由于
cvs.reader
接受任何支持迭代器协议的对象,因此可以使用生成器语法将
||
-s替换为
|
-s,然后将此生成器提供给阅读器:
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即可:)     
        
>>> 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\']
>>>
    
        不幸的是,定界符用C中的字符表示。这意味着在Python中,除单个字符外,不可能有其他任何字符。好消息是,可以忽略为空的值:
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.
还有其他方法可以完成此操作(可以编写一个函数),但这为您提供了所需的逻辑。     
        如果您的数据从字面上看像示例(这些字段从不包含\'|| \'且始终被引号),并且您可以容忍引号,或者愿意在以后将其切掉,只需使用
.split
>>> \'\"1234\"||\"abcd\"||\"a1s1\"\'.split(\'||\')
[\'\"1234\"\', \'\"abcd\"\', \'\"a1s1\"\']
>>> list(s[1:-1] for s in \'\"1234\"||\"abcd\"||\"a1s1\"\'.split(\'||\'))
[\'1234\', \'abcd\', \'a1s1\']
仅当在字段中找到定界符或删除字段周围的可选引号时才需要csv     

要回复问题请先登录注册