Python 从文件中获取前x行,并匹配子字符串
我有一个通过FTP下载的文件。这是一个非常大的文件,所以我现在只想处理第一行,比如说20行。我想把这20行代码写入本地机器上的一个新文件。在这个过程中,我想匹配行中的一个值 文件以管道分隔,每行的开头如下所示: 9999-12-31 | XX | 我只想在第二个字段的值为XX时写入输出文件,否则,忽略它 以下是我的基本代码:Python 从文件中获取前x行,并匹配子字符串,python,ftplib,Python,Ftplib,我有一个通过FTP下载的文件。这是一个非常大的文件,所以我现在只想处理第一行,比如说20行。我想把这20行代码写入本地机器上的一个新文件。在这个过程中,我想匹配行中的一个值 文件以管道分隔,每行的开头如下所示: 9999-12-31 | XX | 我只想在第二个字段的值为XX时写入输出文件,否则,忽略它 以下是我的基本代码: def writeline(line): file.write(line + "\n") file = open(localDir + fileName, "w+
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行。尝试以其他方式打开文件,例如: def writelinei,第行: 如果行[11:13]=“XX”: file.writeline+\n i+=1 返回i file=openlocalDir+fileName.read.splitlines i=0 而我<20: i=写入文件[i]
如果您想处理整个文件,这里提供了根据过滤模式过滤文件和写入其他文件的函数:
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)
以前从未尝试过,但使用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函数中重新打开文件。另一方面,它可以确保文件被正确关闭,这可能会在一段时间后被忘记,并在未正确处理时导致问题。您可以尝试在回调函数中使用itertools.islice。这是否需要成为更大程序的一部分。我会考虑使用AWK来代替它,而不是Python。它可能是这样的,awk-F |{如果NR<21{print$2}}>new_file.txt,您可能可以打开一个管道到该文件以提供awk,这样您就不必在本地拥有它,因为您提到了它的大小。