Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从文件中获取前x行,并匹配子字符串_Python_Ftplib - Fatal编程技术网

Python 从文件中获取前x行,并匹配子字符串

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+

我有一个通过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行。

尝试以其他方式打开文件,例如:

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,这样您就不必在本地拥有它,因为您提到了它的大小。