Python 将文本数据转换为数据帧的问题
我有一个文本文件,其中有几行,它们之间有一些数据,我需要将这些数据转换为dataframe(有用的数据) 我逐行迭代文本文件,并在正则表达式的帮助下捕获有用的数据 像这样的,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()
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不客气。很高兴这对你有用。