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

时间:2015-06-12 13:18:22

标签: python ftplib

我有一个文件,我正在通过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行的问题。

3 个答案:

答案 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函数中重新打开文件。另一方面,它确保文件正确关闭,一段时间后可能会被遗忘,并在未正确处理时导致问题。