我有一个文件,我正在通过FTP下载。这是一个非常大的文件,所以我想只获得第一个说法,现在可以使用20行。我想将这20行写入本地计算机上的新文件。在这个过程中,我希望匹配行内的值。
该文件是以管道分隔的,每行的开头如下所示:
9999-12-31 | XX | ...
我想只在第二个字段的值为XX时写入输出文件,否则忽略它。
以下是我的代码的基础知识:
def writeline(line):
file.write(line + "\n")
file = open(localDir + fileName, "w+")
ftp.retrlines("RETR '" + remotePath + "'", writeline)
如果我想输出整个文件,所有这些代码都可以正常下载文件。我试着在我的writeline
函数中放入一个while循环,但是它只会将每行写入我在循环中指定的次数,这在事后才有意义。似乎while循环需要在retrlines
函数中以某种方式。
我对Python很陌生,所以我感谢您提供的任何帮助,感谢您对我的noob问题的耐心。
更新 好吧,看起来匹配子字符串,我可以这样做:
line[11:13]
但这仍然让我遇到了尝试只使用前x行的问题。
答案 0 :(得分:0)
我想处理整个文件,这里是根据过滤模式过滤文件和写入其他文件的函数:
def get(f, pattern="XX", index=1, sep="|", max=100):
c = 0
with open(f) as in_:
for line in in_:
if line.split(sep)[index] == pattern:
c += 1
yield line
if c == max:
return
def set(outf, inf):
with open(outf, "w") as out:
for l in get(inf):
out.write(l)
set("out.txt", f)
答案 1 :(得分:-1)
尝试以其他方式打开文件,例如:
def writeline(i,line):
if line[11:13] == 'XX':
file.write(line + "\n")
i+=1
return i
file_ = open(localDir + fileName).read.splitlines()
i = 0
while i < 20:
i = writeline(file_[i])
答案 2 :(得分:-1)
之前从未尝试过,但使用ftp.abort()应该可以终止数据传输。
快速模型,未经测试,我将如何做到:
counter = 0
def writeline(line):
if 'XX' in line.split('|') and counter < 20:
with open(filename, 'a') as f:
f.write(line += "\n")
counter += 1
if counter == 20:
ftp.abort()
ftp.retrlines("RETR '" + remotePath + "'", writeline)
虽然看起来有点丑陋总是在writeline函数中重新打开文件。另一方面,它确保文件正确关闭,一段时间后可能会被遗忘,并在未正确处理时导致问题。