1

我有一个文件,我试图从中提取信息,该文件中包含信息,并且是逐行格式,信息用逗号分隔。

我想把它放在一个列表中,或者尽我所能从特定索引中提取信息。该文件很大,有超过 1000000000 行,我必须在每一行中提取相同的索引才能获得相同的信息。这些是我想要从文件中获取的哈希值,所以我想知道如何根据长度找到所有出现的哈希值。

import os

os.chdir('C:\HashFiles')

f = open('Part1.txt','r')

file_contents=f.readlines()

def linesA():

for line in file_contents:
    lista = line.split(',')

print linesA()

这就是我到目前为止所拥有的一切,这只是将所有内容放在一个我可以索引的列表中,但我想将这些索引中的数据输出到另一个文件,但由于 for 语句我无法做到,我该如何解决这?

哇你们太棒了,现在我有一个问题,因为在存储此信息的文件中,它以提供信息的赞助商的信息开头,我如何绕过这些行从另一行开始,因为我需要的行从文件中大约有 100 行,以帮助我,因为目前我遇到索引错误并且无法弄清楚如何设置条件来应对它。我尝试了这种情况但没有用:如果 line[:] != 15: continue

可使用的最新代码:

导入 csv

with open('c:/HashFiles/search_engine_primary.sql') as inf, open('c:/HashFiles/hashes.txt','w') as outf:
for i in xrange(47):
    inf.next()       # skip a line

for line in inf:
    data = line.split(',')
    if str(line[0]) == 'GO':
        continue
    hash = data[15]
    outf.write(hash + '\n')
4

3 回答 3

4

您可以尝试逐行处理文件

 with open('Part1.txt') as inf:
      for line in inf:
          # do your processing
          # ... line.split(',') etc...

而不是使用readlines()which一次将所有数据读入内存

此外,根据您在做什么, 列表理解可能有助于从您正在阅读的文件中创建所需的输出列表。

注意:使用with打开文件的好处是当你完成或遇到异常时它会自动为你关闭它。

更新

要跳过输入文件的第一N行,您可以将代码更改为:

N = 100

with open('Part1.txt') as inf:
     for i, line in enumerate(inf, 1):
         if i < N:   # if line is less than N
            continue # skip the processing
         print line  # process the line

我正在使用enumerate()自动生成行号。我从 1 开始这个计数器(如果未指定,则默认为 0)。

于 2012-06-20T15:40:39.380 回答
2

您可以逐行处理文件,如下所示:

with open('c:/HashFiles/Part1.txt') as inf, open('c:/HashFiles/hashes.txt','w') as outf:
    for line in inf:
        data = line.split(',')
        hash = data[4]
        outf.write(hash + '\n')

如果您想按长度分隔散列,可能类似于:

class HashStorage(object):
    def __init__(self, fname_fmt):
        self.fname_fmt = fname_fmt
        self.hashfile = {}

    def thefile(self, hash):
        hashlen = len(hash)
        try:
            return self.hashfile[hashlen]
        except KeyError:
            newfile = open(self.fname_fmt.format(hashlen), 'w')
            self.hashfile[hashlen] = newfile
            return newfile

    def write(self, hash):
        self.thefile(hash).write(hash + '\n')

    def __del__(self):
        for f in self.hashfiles.itervalues():
            f.close()
        del self.hashfiles

store = HashStorage('c:/HashFiles/hashes{}.txt')

with open('c:/HashFiles/Part1.txt') as inf:
    for line in inf:
        data = line.split(',')
        hash = data[4]
        store.write(hash)

编辑: : 有没有办法识别赞助商行 - 例如,它们以“#”开头?你可以过滤像

with open('c:/HashFiles/Part1.txt') as inf, open('c:/HashFiles/hashes.txt','w') as outf:
    for line in inf:
        if not line.startswith('#'):
            data = line.split(',')
            hash = data[4]
            outf.write(hash + '\n')

否则,如果您必须跳过 N 行 - 这很糟糕,因为如果数字发生变化怎么办?- 你可以改为

with open('c:/HashFiles/Part1.txt') as inf, open('c:/HashFiles/hashes.txt','w') as outf:
    for i in xrange(N):
        inf.next()       # skip a line

    for line in inf:
        data = line.split(',')
        hash = data[4]
        outf.write(hash + '\n')

编辑2:

with open('c:/HashFiles/search_engine_primary.sql') as inf, open('c:/HashFiles/hashes.txt','w') as outf:
    for i in xrange(47):
        inf.next()       # skip a line

    for line in inf:
        data = line.split(',')
        if len(data) > 15:      # skip any line without enough data items
            hash = data[15]
            outf.write(hash + '\n')

这仍然给你错误吗?

于 2012-06-20T15:41:41.377 回答
1
import csv

with open(os.path.join('C:\HashFiles','Part1.txt'), 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row
于 2012-06-20T15:52:27.687 回答