我的数据看起来像是:
"1234"||"abcd"||"a1s1"
我正在尝试使用Python的csv阅读器和编写器进行读写。 由于csv模块的分隔符仅限于单个字符,是否有任何方法可以干净地检索数据?我无法删除空列,因为它是一个庞大的数据集,需要以时间限制的方式处理。任何想法都会有所帮助。
答案 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