6

几个月内我有大约 500GB 的文本文件。在这些文本文件中,前 43 行只是连接信息(不需要)。接下来的 75 行是观察的描述符。接下来是 4 行(不需要),然后是下一个观察值,即 75 行。

我想要的只是这 75 行(每次观察的描述符都在同一个位置),其特征如下:

ID: 5523
Date: 20052012
Mixed: <Null>
.
.

我想5523;20052012;;..为每个观察将其更改为 csv 格式。所以我最终得到的文本文件要小得多。由于描述符是相同的,我会知道例如第一个位置是 ID。

完成文本文件后,我将打开下一个文件并附加它(或者创建一个新文件会更快吗?)。

我所做的工作效率很低,我一直在打开文件。加载它。逐行删除这些观察结果。如果它对测试样本有相当大的影响,那么它显然不是最好的方法。

任何建议都会很棒。

4

3 回答 3

6

你说你有“大约 500GB 的文本文件”。如果我理解正确,则每次观察都没有固定的长度(注意,我不是在谈论数,我指的是观察的所有行的总长度,以字节为单位)。这意味着您不得不浏览整个文件,因为您无法确切知道换行符的位置。

现在,根据每个单独的文本文件的大小,您可能需要寻找不同的答案。但是如果每个文件都足够小(小于 1 GB?),您也许可以使用该linecache模块,它会为您处理逐行查找。

您可能会像这样使用它:

import linecache

filename = 'observations1.txt'

# Start at 44th line
curline = 44
lines = []

# Keep looping until no return string is found
# getline() never throws errors, but returns an empty string ''
# if the line wasn't found (if the line was actually empty, it would have
# returned the newline character '\n')
while linecache.getline(filename, curline):
    for i in xrange(75):
        lines.append(linecache.getline(filename, curline).rstrip())
        curline += 1

    # Perform work with the set of observation lines
    add_to_observation_log(lines)

    # Skip the unnecessary section and reset the lines list
    curline += 4
    lines = []

我对此进行了测试,它在五秒钟内浏览了一个 23MB 的文件。

于 2012-05-20T19:06:08.487 回答
2

打开文件。加载它。逐行删除这些观察结果。

“加载它”是什么意思?如果你的意思是把整个东西读成一个字符串,那么是的,这会很糟糕。处理文件的自然方法是利用文件对象是文件行上的迭代器这一事实:

for line in file:
    if should_use(line): do_something_with(line)
于 2012-05-20T19:17:48.620 回答
0

您应该考虑将要保留的信息写入数据库。在 python 中,您可以使用内置的 sqlite3。从文档中很容易理解。

你说你现在正是你想要保留的每个文件中的行。所以你可以尝试这样的事情。

    import csv
    reader = csv.reader(open("afile.csv","rb"),delimiter="\t",quotechar='"')
    info_to_keep = []
    obs = []
    for row in reader:
       i+=1
       if i<43:
           continue
       elif i-43 <79*(len(info_to_keep)+1)-4:
           obs.append(row)
       elif i-43 <79*(len(info_to_keep)+1):
           continue
       else:
           info_to_keep.append(obs)
           obs = [row]

这样,您可以拥有一个名为 info_to_keep 的列表,其中每个条目包含一个包含 75 个条目的列表,每个条目包含一个包含 csv 文件中的字段的列表

于 2012-05-20T19:46:17.287 回答