首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在用列编写的文件中查找特定要求并将其复制到另一个文件

如何在用列编写的文件中查找特定要求并将其复制到另一个文件
EN

Stack Overflow用户
提问于 2013-10-11 14:40:03
回答 2查看 106关注 0票数 1

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

代码语言:javascript
运行
复制
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的条件。这是我为此编写的代码,但是在我的new_file中没有写任何东西:

代码语言:javascript
运行
复制
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

我认为问题可能在于天线数量与我匹配,但我不知道为什么.我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-11 15:56:55

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

代码问题

首先,每次调用f1.readline()时,它都从停止读取的位置读取。因此,在第一次读取之后,您只能得到文件的其余部分,而不是整个文件。您需要做的是将文件的内容存储在循环之外的列表中,然后按照当前的方式循环,除了从这个列表中取来的行而不是文件。

接下来,您要尝试将字符串与columns1==i中的整数进行比较,您必须将一个字符串转换为另一个字符串,所以在比较中可能需要int(columns1)==i。

当您试图写入输出文件时,也会发生类似的错误,您必须将i转换为字符串,以便将'\n‘添加到其中,因此类似于f2.write(str(i)+'\n')之类的内容将完成此操作。

进行这些更改的结果代码如下:

代码语言:javascript
运行
复制
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()函数将元素添加到集合中。

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

代码语言:javascript
运行
复制
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的高效读取算法),同时也只检查每行一次,而不是每个天线值一次。

票数 2
EN

Stack Overflow用户

发布于 2013-10-11 15:01:07

代码语言:javascript
运行
复制
    for i in range(1,11): 
        for line in f1.readlines()[4:]:

这样做的目的是“试着读取文件中的所有行10遍”。听起来不对..。

代码语言:javascript
运行
复制
            if len(columns) > 3 and columns[1] == i:

因此,i是行计数(由于第一个问题,它不能工作,但让我们假设它是行计数),并使用它来选择列?这听起来也不对。

也许像这样的东西(没有经过测试):

代码语言:javascript
运行
复制
f1 = open('file');
f2 = open('new_file', 'a');
for line in f1.readlines()[4:]:
    columns = line.split()
    if len(columns) > 3:
        f2.write(columns[0]+'\n')

今后,我建议在代码中添加调试打印,这通常会有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19320912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档