Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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 循环脚本以从文本文件中提取特定数据_Python_Loops - Fatal编程技术网

Python 循环脚本以从文本文件中提取特定数据

Python 循环脚本以从文本文件中提取特定数据,python,loops,Python,Loops,我希望使用Python循环遍历一个文件并从两个特定的数据列中提取数据,下面是示例数据 ---------------------------------- 本地小区ID小区名称物理小区ID附加频谱发射小区活动状态小区管理状态小区中间块定时器(min)小区FDD TDD指示子帧分配特殊子帧模式 11 12345678912345678912345678912 427 1活动取消阻止空TDD SA2 SSP6 12 123456789123456789123456789130 1活动取消阻止空TDD

我希望使用Python循环遍历一个文件并从两个特定的数据列中提取数据,下面是示例数据

----------------------------------
本地小区ID小区名称物理小区ID附加频谱发射小区活动状态小区管理状态小区中间块定时器(min)小区FDD TDD指示子帧分配特殊子帧模式
11 12345678912345678912345678912 427 1活动取消阻止空TDD SA2 SSP6
12 123456789123456789123456789130 1活动取消阻止空TDD SA2 SSP6
14 1234567891234567891234567891294 1活动取消阻止空TDD SA2 SSP6
15 12345678912345678912345678912 37 1活动取消阻止空TDD SA2 SSP6
21 123456789234567891234567812345678912 188 1活动取消阻止空TDD SA2 SSP6
22 12345678912345678912345678912 203 1活动取消阻止空TDD SA2 SSP6
24 1234567891234567891234567891209 1活动取消阻止空TDD SA2 SSP6
25 12345678912345678912345678912 230 1活动取消阻止空TDD SA2 SSP6
(结果数量=8)
---结束
我使用了下面的脚本来拉取具有特定值的每一行,但我想知道是否可以只拉取“Cell Name”和“Physical Cell ID”下的数据,第4行的数据是12345678912345678912和427

signal = open('signal.txt', 'r') 
newFile = open('results2.txt', 'w') 
for line in signal: 
    if 'False' in line: 
        print('.', end="") 
        newFile.write(line) 
    else: 
        print(" ", end="") 
newFile.close() 
signal.close() 
print('Done')

@J.Byrne,另一种方法是使用
pandas
dataframe
read_csv
拉入数据(忽略第1行和底部数据,添加列名)并选择您感兴趣的列

请参阅此代码以拉取:

import pandas as pd
df=pd.read_csv('signal.txt', skiprows=2,skipfooter=4, sep='\s+', 
            names=[
                'Local Cell ID',  
                'Cell Name',                        
                'Physical cell ID',  
                'Additional spectrum emission',  
                'Cell active state',  
                'Cell admin state',  
                'Cell middle block timer(min)',  
                'Cell FDD TDD indication',  
                'Subframe assignment',  
                'Special subframe patterns'], 
            engine='python')

df
结果如下:

Local Cell ID   Cell Name   Physical cell ID    Additional spectrum emission    Cell active state   Cell admin state    Cell middle block timer(min)    Cell FDD TDD indication Subframe assignment Special subframe patterns
0   11  12345678912345678912345678912   427 1   Active  Unblock NaN TDD SA2 SSP6
1   12  12345678912345678912345678912   130 1   Active  Unblock NaN TDD SA2 SSP6
2   14  12345678912345678912345678912   94  1   Active  Unblock NaN TDD SA2 SSP6
3   15  12345678912345678912345678912   37  1   Active  Unblock NaN TDD SA2 SSP6
4   21  12345678912345678912345678912   188 1   Active  Unblock NaN TDD SA2 SSP6
5   22  12345678912345678912345678912   203 1   Active  Unblock NaN TDD SA2 SSP6
6   24  12345678912345678912345678912   209 1   Active  Unblock NaN TDD SA2 SSP6
7   25  12345678912345678912345678912   230 1   Active  Unblock NaN TDD SA2 SSP6
Cell Name   Physical cell ID
0   12345678912345678912345678912   427
1   12345678912345678912345678912   130
2   12345678912345678912345678912   94
3   12345678912345678912345678912   37
4   12345678912345678912345678912   188
5   12345678912345678912345678912   203
6   12345678912345678912345678912   209
7   12345678912345678912345678912   230
使用此选项可筛选:

df[["Cell Name","Physical cell ID"]]
结果如下:

Local Cell ID   Cell Name   Physical cell ID    Additional spectrum emission    Cell active state   Cell admin state    Cell middle block timer(min)    Cell FDD TDD indication Subframe assignment Special subframe patterns
0   11  12345678912345678912345678912   427 1   Active  Unblock NaN TDD SA2 SSP6
1   12  12345678912345678912345678912   130 1   Active  Unblock NaN TDD SA2 SSP6
2   14  12345678912345678912345678912   94  1   Active  Unblock NaN TDD SA2 SSP6
3   15  12345678912345678912345678912   37  1   Active  Unblock NaN TDD SA2 SSP6
4   21  12345678912345678912345678912   188 1   Active  Unblock NaN TDD SA2 SSP6
5   22  12345678912345678912345678912   203 1   Active  Unblock NaN TDD SA2 SSP6
6   24  12345678912345678912345678912   209 1   Active  Unblock NaN TDD SA2 SSP6
7   25  12345678912345678912345678912   230 1   Active  Unblock NaN TDD SA2 SSP6
Cell Name   Physical cell ID
0   12345678912345678912345678912   427
1   12345678912345678912345678912   130
2   12345678912345678912345678912   94
3   12345678912345678912345678912   37
4   12345678912345678912345678912   188
5   12345678912345678912345678912   203
6   12345678912345678912345678912   209
7   12345678912345678912345678912   230

请参阅下面的另一种方法。您可以循环查看txt文件
signal.txt
中的行,然后调用搜索函数以获取
CellName
PhysicalCellID

import re
import pandas as pd
mydicts = []

def FindCellName(line):#create a function looking at each line
    CellName=None #empty the variable
    j=re.findall('\d{29}', line) #find string with 29 characters
    if len(j)>0:
            CellName=j[0] #if it exists assign it to CellName
    return CellName

def FindPhysicalCellID(line):#create a function looking at each line
    PhysicalCellID=None #empty the variable
    res= re.search('\d{29}(.*)               1', line) #find string after the 29 characters and before the 1
    if res:
            PhysicalCellID=res.group(1) #if it exists assign it to PhysicalCellID
    return PhysicalCellID

with open('signal.txt') as topo_file:
    for line in topo_file:
        if FindCellName(line) : #if CellName exists 
            mydicts.append((FindCellName(line), FindPhysicalCellID(line))) # append CellName and PhysicalCellID in the diction
    df=pd.DataFrame(mydicts, columns=('CellName', 'PhysicalCellID'))
df
结果如下:

CellName    PhysicalCellID
0   12345678912345678912345678912   427
1   12345678912345678912345678912   130
2   12345678912345678912345678912   94
3   12345678912345678912345678912   37
4   12345678912345678912345678912   188
5   12345678912345678912345678912   203
6   12345678912345678912345678912   209
7   12345678912345678912345678912   230
​

听起来像是该功能的工作。您也可以使用
pandas
read_csv
。感谢@Medwin,我已经使用了您的脚本,它正在正确地拉取,我现在尝试使用相同的数据,但有更多的列(总共61列),但我得到以下错误:pandas.errors.parserror:第11行中预期有61个字段,saw 205。错误可能是由于使用多字符分隔符时忽略了引号。文件中可能有一行输出205列。在你浏览文件之前,很难知道是哪一行。将
read_csv
更改为
df=pd.read_csv('signal.txt',skiprows=2,skipfooter=4,sep='\s+',name=['patterns'],engine='python',lineterminator='\n')
。我已经添加了
lineterminator='\n'
。也可以尝试这样做:
df=pd.read\u csv('signal.txt',skiprows=2,skipfooter=4,sep='\s+',names=['patterns',engine='python',error\u bad\u lines=False)
;这会试图忽略
错误行
。上述两个错误仍然相同,请参阅我需要的数据仅为“单元名称”和“物理单元ID”,是否可以先清除列“特殊子帧模式”后的任何数据?然后我就可以在剩下的数据上运行初始脚本了。我不确定这是否有效。但我认为另一种方法是跟踪
signal.txt
中的哪一行导致了这个问题,并创建一个案例逻辑来避免它。