2012-12-04 34 views
3

我在python中解析一個非常大的csv(大=幾十千兆字節)文件,我只需要每行的第一列的值。我寫了這個代碼,不知道是否有更好的方式來做到這一點:有效的方法來獲取字符串的一部分,直到標記

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

有第一分隔符之前得到的字符串部分更有效的方式?

編輯:我知道關於CSV模塊(我偶爾會用到它),但我不需要在內存中加載每一行文件 - 我需要第一列。所以讓我們專注於字符串解析。

+0

http://docs.python.org/2/library/csv.html –

+0

是什麼樣的這個代碼你覺得不盡人意?它是否花了太長時間,使用太多內存,你是否以文體爲由反對它? – NPE

+0

不,它可以正常工作,我對python還不是很有信心。 – ddinchev

回答

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模塊將處理包含引號等引用列...

0

Personnally,我會用發電機做:

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 
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'

+0

謝謝!如果我能改變它,我會接受這個答案! – ddinchev

相關問題