我有一个文件,我正在尝试从中提取信息,文件中包含信息,并且线条格式整齐,信息以逗号分隔。
我想把它放在一个列表中,或者尽我所能从特定索引中提取信息。该文件非常庞大,超过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')
答案 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