这是我的文本文件的第一行
。0.112296E+02-.121994E-010.158164E-030.158164E-030.000000E+000.340000E+030.328301E-010.000000E+00
应该有8列,有时用“-”分隔,有时用“.”。这很令人困惑,我只需要处理这个文件,而不是生成它。
第二个问题:如何处理不同的列?没有表头,所以可能是:
df.iloc[:,0]
.. ?
这是我的文本文件的第一行
。0.112296E+02-.121994E-010.158164E-030.158164E-030.000000E+000.340000E+030.328301E-010.000000E+00
应该有8列,有时用“-”分隔,有时用“.”。这很令人困惑,我只需要处理这个文件,而不是生成它。
第二个问题:如何处理不同的列?没有表头,所以可能是:
df.iloc[:,0]
.. ?
正如评论所述,这很可能是一组科学计数法表示的数字,它们没有被任何分隔符分开,只是简单地拼在一起。 它可以被解释为:
0.112296E+02
-.121994E-010
.158164E-030
.158164E-030
.000000E+000
.340000E+030
.328301E-010
.000000E+00
0.112296E+02
-.121994E-01
0.158164E-03
0.158164E-03
0.000000E+00
0.340000E+03
0.328301E-01
0.000000E+00
data = [line[i:i+12] for i in range(0, len(line), 12)]
import re
line = '0.112296E+02-.121994E-010.158164E-030.158164E-030.000000E+000.340000E+030.328301E-010.000000E+00'
pattern = '[+-]?\d??\.\d+E[+-]\d+'
data = re.findall(pattern, line)
编辑
显然,您需要遍历文件中的每一行,并将其添加到数据帧中。在Pandas中这是一件相当低效的事情。因此,如果您更喜欢固定宽度的解释方式,我建议使用 @Ev. Kounis 的答案:df = pd.read_fwf(myfile, widths=[12]*8)
否则,低效的方法是:
df = pd.DataFrame(columns=range(8))
with open(myfile, 'r') as f_in:
for i, lines in enumerate(f_in):
data = re.findall(pattern, line)
df.loc[i] = [float(d) for d in data]
这里需要注意两点:DataFrame必须使用列名进行初始化(这里使用的是[0,1,2, 3...7]等标识符,但也许您知道更好的标识符); 而且正则表达式给我们提供了必须转换为浮点数的字符串。
\d{2}
代替\d+
,以捕获第二种形式。 - Dunes正如我在评论中所说,这不是多个分隔符的情况,而只是一个固定宽度格式。 Pandas
有一种读取此类文件的方法。请尝试以下内容:
df = pd.read_fwf(myfile, widths=[12]*8)
print(df) # prints -> [0.112296E+02, -.121994E-01, 0.158164E-03, 0.158164E-03.1, 0.000000E+00, 0.340000E+03, 0.328301E-01, 0.000000E+00.1]
对于宽度,您需要提供单元格宽度,看起来像是12,以及列数,正如您所说必须为8。
您可能会注意到读取结果并不完美(请注意第4个和最后一个元素中逗号前面的.1
),但我正在努力改进。
或者,您可以这样“手动”完成:
myfile = r'C:\Users\user\Desktop\PythonScripts\a_file.csv'
width = 12
my_content = []
with open(myfile, 'r') as f_in:
for lines in f_in:
data = [float(lines[i * width:(i + 1) * width]) for i in range(len(lines) // width)]
my_content.append(data)
print(my_content) # prints -> [[11.2296, -0.0121994, 0.000158164, 0.000158164, 0.0, 340.0, 0.0328301, 0.0]]
每一行都将是一个嵌套列表。
row = '0.112296E+02-.121994E-010.158164E-030.158164E-030.000000E+000.340000E+030.328301E-010.000000E+00'
chunckLen = 12
for i in range(0, len(row), chunckLen):
print(row[0+i:chunckLen+i])