python - 如何在列写的文件中找到特定需求并将其复制到另一个文件

标签 python

我有一个像这样按列写的文件(我写第一行但更长):

Ncol 10  Nrow 9276
   NO_POL   =            2
   NO_IF    =            8
NO.   ANTENNA   SUBARRAY   TSYS   TANT
 1       1         1        37     35 
 2                          37     35
 3                          37     35
 4       1         1        37     35
 5                          37     35
 6                          37     35
 7       3         1        37     35
 8                          37     35
 9                          37     35
10       3         1        37     35
11                          37     35

我想在另一个文件中复制该文件中出现的天线数量,但我希望天线的数量在另一个文件中只出现一次。最大天线数为 10。

我所做的是从第 5 行开始的列中读取文件。就像我只想在出现天线数量的行中看到一样,我提出了列的长度必须大于 3 的条件。这是我为此编写的代码,但没有写任何内容在我的新文件中:

with open('file') as f1:
    with open('new_file','a') as f2:
        for i in range(1,11): 
            for line in f1.readlines()[4:]:
                columns = line.split()
                if len(columns) > 3 and columns[1] == i:
                    f2.write(i+'\n')
                    break

我认为问题可能出在天线数量与 i 匹配的情况下,但我不知道为什么......我做错了什么?

最佳答案

有几件事需要解决。我将从更正类型/代码错误开始,然后解决算法本身。

代码问题

对于初学者来说,每次调用 f1.readlines() 时,它都会从停止读取的地方开始读取。所以在第一次读取后你只能得到文件的其余部分而不是整个文件。您需要做的是将文件的内容存储在循环之外的列表中,然后您将以与当前相同的方式循环,除了行来自此列表而不是文件。

接下来,您要尝试将字符串与列[1]==i 中的整数进行比较,您必须将一个转换为另一个,所以在比较中可能是 int(columns[1])==i .

当您尝试写入输出文件时会发生类似的错误,您必须将 i 转换为字符串才能向其添加 '\n',例如 f2.write(str(i)+'\n') 会做的。

经过这些更改后的代码将是:

f1=open('file')
contents=f1.readlines()[4:]
f1.close() #we don't need it anymore
with open('new_file','a') as f2:
    for i in range(1,11):
        for line in contents:
            columns = line.split()
            if len(columns) > 3 and int(columns[1]) == i:
                f2.write(str(i)+'\n')
                break

它似乎在我的机器上如你所愿地工作。

算法

您正在做的是选择一个天线编号,然后查看整个文件以查看是否存在包含该天线编号的行。这当然是一种方法,但如果您打算对大文件进行这种处理,则该算法将花费相当长的时间。另一种更有效的方法是使用集合。

Python 有一个 set() 函数,它创建一个空集,然后您可以使用 add() 函数向该集添加元素。

所以你最终可能会做这样的事情:

antennae=set()
f1=open('file')
lineno=1
for line in f1:
    if lineno >= 5:
        row = line.split()
        if len(row) > 3:
            antennae.add(int(row[1]))
    lineno+=1
f1.close()
f2=open('new_file','a')
for antenna in antennae:
    f2.write(str(antenna)+'\n')
f2.close()

这个版本在内存和时间上都是高效的,因为我们只在需要时读取线(并且我们正在使用 python 的高效读取算法),同时也只检查每条线一次而不是每个天线值一次。

关于python - 如何在列写的文件中找到特定需求并将其复制到另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19320912/

相关文章:

python - 过期后自动从订阅数据库中删除项目?

python - 为什么 .png 文件不能使用 Python 脚本下载,而它适用于其他图像类型?

调用类方法时 Python Nose2 测试未完成

python - pyqt中使用lambda表达式连接槽

python - 这个宏是如何工作的?

python - OpenCV:如何规范化面部(去除阴影)?

python - 如何在python中不指定默认参数?

python - 是否可以根据 Python 中的密码安全地加密然后解密数据?

python - 创建 Pyomo 约束的性能

python - Pandas ,比较索引和列移位位置中的 2 个数据帧