3

我在 python 中解析一个非常大的 csv(大 = 数十 GB)文件,我只需要每行第一列的值。我写了这段代码,想知道是否有更好的方法:

delimiter = ','
f = open('big.csv','r')
for line in f:
    pos = line.find(delimiter)
    id = int(line[0:pos])

有没有更有效的方法来获取第一个分隔符之前的字符串部分?

编辑:我确实知道 CSV 模块(我偶尔使用过),但我不需要将此文件的每一行都加载到内存中 - 我需要第一列。所以让我们专注于字符串解析。

4

3 回答 3

4
>>> a = '123456'
>>> print a.split('2', 1)[0]
1
>>> print a.split('4', 1)[0]
123
>>> 

但是,如果您正在处理 CSV 文件,那么:

import csv
with open('some.csv') as fin:
    for row in csv.reader(fin):
        print int(row[0])

并且 csv 模块将处理包含引号等的引用列...

于 2012-12-04T14:54:49.217 回答
1

如果第一个字段中不能有转义分隔符,例如在您的情况下,第一个字段是整数并且在任何字段中都没有嵌入换行符,即每一行对应于文件中的一个物理行,那么csv模块是过度杀伤,您可以使用问题中的代码或line.split(',', 1)@Jon Clements 建议的代码

要处理其中没有分隔符的偶尔行,您可以使用str.partition

with open('big.csv', 'rb') as file:
    for line in file:
       first, sep, rest = line.partition(b',')
       if sep: # the line has ',' in it
          process_id(int(first)) # or `yield int(first)`

注意:s.split(',', 1)[0]如果字符串中没有分隔符,则静默返回错误结果(整个字符串)。

'rb'文件模式用于避免不必要的行尾操作(以及 Python 3 上对 Unicode 的隐式解码)。如果 csv 文件'\n'在每个原始文件的末尾都有,那么使用它是安全的,即换行符是'\n'或者'\r\n'

于 2012-12-04T16:05:56.717 回答
0

就个人而言,我会使用发电机:

from itertools import imap
import csv

def int_of_0(x):
    return(int(x[0]))

def obtain(filepath, treat):
    with open(filepath,'rb') as f:
        for i in imap(treat,csv.reader(f)):
            yield i

for x in obtain('essai.txt', int_of_0):
    # instructions
于 2012-12-04T16:04:14.090 回答