如何使用Python的csv模块拆分双管道分隔数据

8 投票
4 回答
9594 浏览
提问于 2025-04-16 19:35

我有一些数据,格式如下:

"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数据源输出的行不会超过你的可用内存 :)

撰写回答