Python 将文本数据转换为数据帧的问题

Python 将文本数据转换为数据帧的问题,python,regex,pandas,Python,Regex,Pandas,我有一个文本文件,其中有几行,它们之间有一些数据,我需要将这些数据转换为dataframe(有用的数据) 我逐行迭代文本文件,并在正则表达式的帮助下捕获有用的数据 像这样的, pattern = r'^(\s)(\d+)(\s+)(\d)(\s+)(\w+)(\s+)(\w+)(.*)' capture_data = [] with open(file,'r') as file_obj: lineList = file_obj.readlines()

我有一个文本文件,其中有几行,它们之间有一些数据,我需要将这些数据转换为dataframe(有用的数据)

我逐行迭代文本文件,并在正则表达式的帮助下捕获有用的数据

像这样的,

pattern = r'^(\s)(\d+)(\s+)(\d)(\s+)(\w+)(\s+)(\w+)(.*)'
capture_data = []

with open(file,'r') as file_obj:
            lineList = file_obj.readlines()
            for line in lineList:
                info_list = re.search(pattern, line)
                if info_list is not None:
                    capture_data.append(line)
捕获的数据如下所示

' 100         0    PASS     Continuity_PPMU_mV        XSCI         140       -1.0000 V      -427.9508 mV   -300.0000 mV   -100.0000 uA   0         \n'

' 100         1    PASS     Continuity_PPMU_mV        XSCI         12        -1.0000 V      -430.3089 mV   -300.0000 mV   -100.0000 uA   0         \n'
我想迭代每个捕获的行,并根据空格进行分割,但问题是,单位与值之间有空格,例如

-300.0000 mV,-100.0000 uA等

还有一个问题是尾随的换行符,它也被视为.split(“”)中的新元素

有人能帮我找到更聪明的方法吗

我只想把这些值作为一个单独的列值

例如,在第一个字符串中

100变为第1列、0-第2列、通过-第3列、连续性\u PPMU\u mV-第4列,等等

谢谢

编辑:

原始数据有点像这样-

Site Number:    
     0,  1,  2,  3

Device#: 1-4

********************************************************************* 
FT45434HAP PQF64 Test @ RHC 
********************************************************************* 
---------------------------Continuity Test--------------------------- 

 Number     Site  Result   Test Name                 Pin          Channel   Low            Measured       High           Force          Loc
 100         0    PASS     Continuity_PPMU_mV        XSCI         140       -1.0000 V      -427.9508 mV   -300.0000 mV   -100.0000 uA   0         
 100         1    PASS     Continuity_PPMU_mV        XSCI         12        -1.0000 V      -430.3089 mV   -300.0000 mV   -100.0000 uA   0         
 100         2    PASS     Continuity_PPMU_mV        XSCI         76        -1.0000 V      -430.7492 mV   -300.0000 mV   -100.0000 uA   0         
 100         3    PASS     Continuity_PPMU_mV        XSCI         204       -1.0000 V      -431.0482 mV   -300.0000 mV   -100.0000 uA   0         
 101         0    PASS     Continuity_PPMU_mV        XSCO         139       -1.0000 V      -456.0359 mV   -300.0000 mV   -100.0000 uA   0         
 101         1    PASS     Continuity_PPMU_mV        XSCO         11        -1.0000 V      -458.0605 mV   -300.0000 mV   -100.0000 uA   0         
 101         2    PASS     Continuity_PPMU_mV        XSCO         75        -1.0000 V      -457.8564 mV   -300.0000 mV   -100.0000 uA   0         
编辑

顶部的行不是固定的,而是动态生成的。此外,一些其他文本数据可能出现在相关数据之间,如两个有用的行之间。因此,我认为跳过行在这里不起作用。

  • 读取文件并查找以
    'Number'
    开头的行,然后将这些行附加到
    数据中
  • 在数据行中,只有单位用空格分隔
  • 最好将单位与数值分开,这样我们就可以在空格上拆分行
  • 创建一个新标题,为单位添加新列
  • 这将允许将数值解释为浮点数
将熊猫作为pd导入
导入seaborn作为sns
#在中读取文件
数据=列表()
以open('test.txt','r')作为f:
行=f.读线()
flag=False#找到带有编号的标题行后将flag设置为True
对于行中的行:
行=行。带()
如果row.startswith('Number'):
flag=True
继续#找到标题行后,跳过它
如果标志:
data.append(row.split())#将标题后面的行附加到数据
#创建自定义标题,其中单位已作为列标题添加
标题=['Number'、'Site'、'Result'、'Test_Name'、'Pin'、'Channel'、'Low'、'U1'、'Measured'、'U2'、'High'、'U3'、'Force'、'U4'、'Loc']
#创建数据帧
df=pd.DataFrame(数据,列=标题)
#保存到csv
df.to_csv('file.csv',index=False)
#将列转换为数字数据类型
df=df.apply(pd.to_numeric,errors='ignore')
#根据柱的单位缩放柱
测得的测向=测得的测向div(1000)
测向高=测向高分区(1000)
df.Force=df.Force.div(100000)
#显示(df)
编号现场结果测试\u名称引脚通道低U1测量U2高U3力U4定位
0 100 0通导通性\u PPMU_mV XSCI 140-1.0 V-0.427951 mV-0.3 mV-0.001 uA 0
1 100 1通连续性\u PPMU_mV XSCI 12-1.0 V-0.430309 mV-0.3 mV-0.001 uA 0
2 100 2通连续性\u PPMU_mV XSCI 76-1.0 V-0.430749 mV-0.3 mV-0.001 uA 0
3 100 3通连续性\u PPMU_mV XSCI 204-1.0 V-0.431048 mV-0.3 mV-0.001 uA 0
4 101 0通路连续性\u PPMU_mV XSCO 139-1.0 V-0.456036 mV-0.3 mV-0.001 uA 0
5 101 1通连续性\u PPMU_mV XSCO 11-1.0 V-0.458060 mV-0.3 mV-0.001 uA 0
6 101 2通连续性\u PPMU_mV XSCO 75-1.0 V-0.457856 mV-0.3 mV-0.001 uA 0
#密谋
ax=sns.lineplot(数据=df.iloc[:,6:-2])
ax.图例(bbox U to_U锚点=(1.05,1),loc='左上角')

您只需跳过第一行并将分隔符指定为
\s\s+

pd.read_csv('file.txt', skiprows=10, sep='\s\s+', engine='python')
输出:

   Number  Site Result           Test Name   Pin  Channel        Low      Measured          High         Force  Loc
0     100     0   PASS  Continuity_PPMU_mV  XSCI      140  -1.0000 V  -427.9508 mV  -300.0000 mV  -100.0000 uA    0
1     100     1   PASS  Continuity_PPMU_mV  XSCI       12  -1.0000 V  -430.3089 mV  -300.0000 mV  -100.0000 uA    0
2     100     2   PASS  Continuity_PPMU_mV  XSCI       76  -1.0000 V  -430.7492 mV  -300.0000 mV  -100.0000 uA    0
3     100     3   PASS  Continuity_PPMU_mV  XSCI      204  -1.0000 V  -431.0482 mV  -300.0000 mV  -100.0000 uA    0
4     101     0   PASS  Continuity_PPMU_mV  XSCO      139  -1.0000 V  -456.0359 mV  -300.0000 mV  -100.0000 uA    0
5     101     1   PASS  Continuity_PPMU_mV  XSCO       11  -1.0000 V  -458.0605 mV  -300.0000 mV  -100.0000 uA    0
6     101     2   PASS  Continuity_PPMU_mV  XSCO       75  -1.0000 V  -457.8564 mV  -300.0000 mV  -100.0000 uA    0

此外,如果您不确定应该忽略多少起始行,您可能会试图找到一个模式来忽略第一行。例如,如果您确定数据模式是一致的,则可以读取第一行,直到第一列匹配为止(在本例中为“Number”):

#确定需要跳过多少行(避免读取整个文件)
Skipline=0
打开('file.txt')作为文件:
line=file.readline()
虽然不是line.lstrip().startswith('Number'):
Skipline+=1
line=file.readline()
#然后和熊猫一起读
pd.read_csv('file.txt',skiprows=skipline,sep='\s\s+',engine='python')

无论如何,利用其逻辑,很容易修改上面的代码块以匹配不同的文件模式。例如,输出将始终显示“连续性测试”行?如果数据总是显示在那一行之后,那就是您要寻找的模式。

Hi,如果我有一个定义了可以跳过的行的txt,这可能会起作用。但遗憾的是,事实并非如此,我在这里发布之前从head中删除了一些条件信息,这些行可以增加或减少,也可以出现在相关数据之间。@KartikMehra,请看一下我刚才所做的修改!谢谢@caina,让我试试看。将更新。请注意,它与您的示例一起工作。但是您必须将“Number”作为实际数据中的第一列,否则它将永远运行,因为我在使用
时使用了
。最好添加一个
和一行!=''在while语句中。@KartikMehra不客气。很高兴这对你有用。