如果使用numpy.loadtxt
具有某种格式(具有特定间距的列),我知道如何从.txt文件中提取数据,但是我现在面临的问题更加复杂。假设a具有以下格式的数据:
*** model xy ***
date: 11.14.18 gate time: 190 sec
enviroment Ug= 483 counts time: 09:19:55
enviroment Ug= 777 counts time: 09:21:55
enviroment Ug= 854 counts time: 09:53:55
.
.
.
对我来说,相关信息是计数和登门时间。我知道我可以使用open("some txt file", "r")
来读取txt文件,但是我不知道如何删除每行的无用信息。
答案 0 :(得分:1)
您需要逐行阅读txt,您可以为此使用readlines()
。对于从第二行开始的每一行,您可以分割字符串
"enviroment Ug= 483 counts time: 09:19:55".split()
这将导致
['enviroment', 'Ug=', '483', 'counts', 'time:', '09:19:55']
您可以访问[2]
和[-1]
元素以获取所需的信息
答案 1 :(得分:1)
为此尝试使用pandas
:
假设您的文件是第一记录为fixed-width
的文件,您可以执行以下操作:
In [1961]: df = pd.read_fwf('t.txt')
In [1962]: df
Out[1962]:
date: 11.14.18 Unnamed: 1 Unnamed: 2 gate time: 190 sec
0 enviroment Ug= 483 counts time: 09:19:55 NaN
1 enviroment Ug= 777 counts time: 09:21:55 NaN
2 enviroment Ug= 854 counts time: 09:53:55 NaN
In [1963]: df.columns
Out[1963]:
Index([u'date: 11.14.18', u'Unnamed: 1', u'Unnamed: 2', u'gate time: 190',
u'sec'],
dtype='object')
# the above gives you the column names.
#You can see in `df` that the counts values and gate_time values lie in individual columns.
因此,只需从dataframe(df)中提取这些列:
In [1967]: df[['Unnamed: 1', 'gate time: 190']]
Out[1967]:
Unnamed: 1 gate time: 190
0 483 time: 09:19:55
1 777 time: 09:21:55
2 854 time: 09:53:55
现在,您可以将以上内容写在csv
文件中。
In [1968]: df.to_csv('/home/mayankp/Desktop/tt.csv', header=False, index=False, columns=['Unnamed: 1', 'gate time: 190'])
这种方法基本上使您不必使用for循环和复杂的正则表达式。
答案 2 :(得分:1)
您可以轻松地一次读取文件中的所有文本,并使用正则表达式查找所需的数据:
import re
with open("some txt file", "r") as fin:
all_text = fin.read()
# Find the gate time
gate_time_r = re.compile(r'gate\s+time:\s+(\d+)', re.IGNORECASE)
gate_time = int(gate_time_r.search(all_text).groups()[0])
# Find the counts
counts_r = re.compile(r'enviroment\s+ug=\s+(\d+)', re.IGNORECASE)
counts_list = list(map(int, counts_r.findall(all_text)))
门时间正则表达式:gate\s+time:\s+(\d+)
仅匹配在字符串gate time:
之后出现数字的模式,并匹配组中的该数字。您只需使用gate_time_r.search(all_text)
运行此正则表达式,它将找到一个匹配项,然后可以选择其第一组。
计算正则表达式:enviroment\s+ug=\s+(\d+)
。它匹配一种模式,即tehre在enciroment ug=
之后是一个数字,并在组中选择该数字。
由于all_text
字符串中有多个匹配项,因此您可以使用findall
搜索所有匹配项。
它将返回正则表达式中存在的组的列表,因此它将是实际计数的列表。只需将其转换为int即可。