1

情報を抽出しようとしているファイルがあります。ファイルには情報が含まれており、行ごとにきちんとした形式であり、情報はコンマで区切られています。

それをリストに入れたい、または特定のインデックスから情報を抽出するためにできることは何でもしたい。ファイルは 1000000000 行を超える巨大なものです。同じ情報を取得するには、すべての行で同じインデックスを抽出する必要があります。これらはファイルから取得したい 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 ステートメントのためにできません。どうすれば回避できますか?これ?

この情報が保存されているファイルでは、情報を提供したスポンサーに関する情報で始まるため、問題が発生しました。これらの行をバイパスして別の行から開始するにはどうすればよいですか?現時点ではインデックスエラーが発生し、それに対抗する条件を設定する方法がわかりません。この条件を試しましたが、うまくいきませんでした: if 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 に答える