我有一个这样的列写的文件(我写第一行,但更长):
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。这是我为此编写的代码,但我的新\u文件中没有编写任何内容:
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
我想问题可能是在天线数量与我匹配的情况下,但我不知道为什么。。。我做错什么了?你知道吗
有几件事要解决。我将首先纠正类型/代码错误,然后解决算法本身。你知道吗
代码问题
对于初学者,每次调用f1.readlines(),它都会从停止读取的位置读取。因此,在第一次读取之后,您只能获得文件的其余部分,而不是整个文件。您需要做的是将文件的内容存储在循环之外的列表中,然后您将以当前的相同方式循环,只是使用来自此列表的行而不是文件。你知道吗
接下来,如果要比较一个字符串与列[1]==i中的整数,则必须将一个字符串转换为另一个字符串,因此在比较中可能是int(列[1])==i。你知道吗
当您尝试写入输出文件时,也会发生类似的错误,您必须将i转换为字符串才能将'\n'添加到输出文件中,因此类似于f2.write(str(i)+'\n')的操作也可以完成。你知道吗
修改后的代码将是:
在我的机器上好像能正常工作。你知道吗
算法
你要做的是选择一个天线号,然后浏览整个文件,看看是否有一行天线号存在。这当然是一种方法,但如果您打算对大文件执行这种处理,则此算法将花费相当长的时间。另一种更有效的方法是使用集合。你知道吗
Python有一个set()函数,该函数创建一个空集,然后使用add()函数将元素添加到集合中。你知道吗
所以你可能会做这样的事情:
这个版本在内存和时间上都很有效,因为我们只读取我们需要的行(并且我们使用python的高效读取算法),同时也只检查每行一次,而不是每个天线值检查一次。你知道吗
它的作用是“将文件中的所有行读10遍”。听起来不对。。。你知道吗
所以
i
是行计数(由于第一个问题,它不起作用,但假设它起作用),您使用它来选择列?这听起来也不对。你知道吗可能是这样(未测试):
以后我建议在代码中添加调试打印,这通常会有所帮助。你知道吗
相关问题 更多 >
编程相关推荐