获取字符串部分直到令牌的有效方法

时间:2012-12-04 14:53:11

标签: python string

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

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

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

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

3 个答案:

答案 0 :(得分: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模块将处理包含引号等的引用列...

答案 1 :(得分:1)

如果第一个字段中没有转义分隔符,例如在第一个字段是整数并且在任何字段中没有嵌入换行符的情况下,即每行对应于文件中的一个物理行那么csv模块就是一种矫枉过正,您可以使用问题中的代码或line.split(',', 1)作为suggested by @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'

答案 2 :(得分: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