我试图在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分钟之内。
答案 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解析(你可能不需要处理引用/转义的逗号等细微之处,但你不需要额外付费! - )并使你的代码更加简洁和优雅。