如何使用Python的csv模块拆分双管道分隔数据
我有一些数据,格式如下:
"1234"||"abcd"||"a1s1"
我正在尝试使用Python的csv读取器和写入器来读取和写入数据。因为csv模块的分隔符只能是一个字符,所以有没有什么办法可以干净地获取数据?我不能删除空列,因为这是一个非常庞大的数据集,需要在有限的时间内处理。任何想法都很有帮助。
4 个回答
1
很遗憾,在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.
还有其他方法可以实现这个功能(比如可以写一个函数),但这段代码给你提供了所需的逻辑。
2
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如,有人可能会在使用某个库时,发现它的功能和自己想要的不太一样。这种情况下,通常需要去查阅文档,看看这个库是怎么工作的,或者有没有其他人遇到过类似的问题。
如果你在网上找资料,像StackOverflow这样的论坛就很有用。在那里,很多程序员会分享他们的经验和解决方案。你可以搜索你遇到的问题,看看别人是怎么解决的,或者直接提问,寻求帮助。
总之,遇到问题时,不要慌张,先查资料,看看有没有解决办法。如果实在找不到,就去问问别人,大家都会乐于帮助你。
>>> 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']
>>>
13
文档和实验表明,只允许使用单个字符作为分隔符。
因为 cvs.reader
可以接受任何支持迭代器协议的对象,所以你可以用生成器的写法把 ||
替换成 |
,然后把这个生成器传给读取器:
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数据源输出的行不会超过你的可用内存 :)