从文本文件中解析/提取数据。无法使它工作

时间:2012-06-20 15:37:14

标签: python parsing

我有一个文件,我正在尝试从中提取信息,文件中包含信息,并且线条格式整齐,信息以逗号分隔。

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

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行开始,以帮助我,因为目前我得到一个索引错误,我无法弄清楚如何设置条件来对付它。我试过这个条件但是没有用:如果行[:]!= 15:继续

最近使用的代码:

导入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')

3 个答案:

答案 0 :(得分:4)

您可以尝试逐行处理文件

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

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

此外,根据您的操作,list comprehension可能有助于从您正在阅读的文件中创建所需的输出列表。

注意:使用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)。

答案 1 :(得分: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')

<强> EDIT2:

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

这仍然会给你错误吗?

答案 2 :(得分: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