无法在python中打开一个大的.csv文件

时间:2014-12-29 15:51:20

标签: python file csv bigdata bitcoin

我试图在python中打开一个大的.csv文件来分隔每一行并将最后的x行追加到一个新列表中。

btcDatear = []
btcPricear = []
btcVolumear = []
howfarback = 20000
try:
    sourceCode = open('.btceUSD.csv', 'r')
    splitSource = sourceCode.split('\n')

        for eachline in splitSource[-howfarback:]:
            splitLine = eachline.split(',')
            btcDate = splitLine[0]
            btcPrice = splitLine[1]
            btcVolume = splitLine[2]

            btcDatear.append(float(btcDate))
            btcPricear.append(float(btcPrice))
            btcVolumear.append(float(btcVolume))


except Exception, e:
    print "failed raw data", str(e)

我用一个20 mb的小文件成功,这个是700 MB,所以我认为我的代码没有任何问题。有没有更好的方法来制作三列的三个separete列表?我需要最后的x号码。或者我可以删除前200.000所以我的文件足够小,可以通过我的代码传递它吗?

要做其中一件事,如果可能的话,必须在-3分钟之内。

1 个答案:

答案 0 :(得分:2)

你不能分割文件"但你可以逐行读取它,无论多大。 E.g:

import collections

btcDatear = []
btcPricear = []
btcVolumear = []
howfarback = 20000
try:
    with open('.btceUSD.csv', 'r') as sourceCode:
        lastNlines = collections.deque(sourceCode, howfarback)
    for eachline in lastNlines:
        splitLine = eachline.split(',')
        btcDate = splitLine[0]
        btcPrice = splitLine[1]
        btcVolume = splitLine[2]

        btcDatear.append(float(btcDate))
        btcPricear.append(float(btcPrice))
        btcVolumear.append(float(btcVolume))
except Exception as e:
    print "failed raw data", str(e)

构建一个deque,其最大长度为howfarback,这是保留文件的最后N行的最佳方法,您只能从头开始逐行读取。 with语句确保文件正确关闭,无论如何;其余的逻辑就像你的代码一样。最好应用标准库csv模块,但是,有一点学习: - )。

可能有一些技巧(巧妙地利用CSV文件可能是可搜索的这一事实)来获得最后的N行"更快 - 在Unixy系统中,tail系统命令非常擅长。如果这种简单方法的表现对你来说太慢,请再次询问,我们将讨论:-) [和/或如何最好地使用csv模块......]

补充:想到它,不需要belabor"尾部技巧",因为它们在Get last n lines of a file with Python, similar to tail得到了很好的解释 - 问题是由Python大师Armin Ronacher,所以你可以对他的代码的质量非常有信心,答案和长时间的讨论都很有趣。

因此,如果这种简单的方法花费的时间太长,研究阿明和他的受访者......非常棘手,但可能真的很有用。

所以我们不妨关注csv模块的使用,在开始import csv之后确定 - 只重写变化的部分...:

    for fields in csv.reader(iter(lastNlines)):
        btcDate, btcPrice, btcVolume = fields[:3]
和以前一样,其余的都是。 csv.reader负责CSV解析(你可能不需要处理引用/转义的逗号等细微之处,但你不需要额外付费! - )并使你的代码更加简洁和优雅。