是否可以使用 Python csv 阅读器读取使用 C++ std::setw 生成的文件?
Is it possible to read files generated with C++ std::setw using Python csv reader?
>我有一个使用 C++std::setw
生成的数据文件,例如
file << std::scientific << std::setprecision(data_precision);
for (double data : a_data)
{
file << std::setw(data_width) << data;
}
file << "n";
是否可以使用python csv.reader或类似方法读取数据?我尝试了以下方法:
with data as csvfile:
fieldreader = csv.reader(csvfile)
next(fieldreader)
for row in fieldreader:
values.append(float(row[0]))
它输出整个第一行,指示整行存储为一个条目。我还尝试了几种不同的分隔符,例如t
没有帮助。
示例输出如下:
# z phi phi1 Massless
-16.0000000 0.0000000 9.9901854997e-01 1.0910677716e-19
-16.0000000 0.0245437 9.9871759471e-01 1.6545142956e-05
-16.0000000 0.0490874 9.9781493216e-01 3.3051500271e-05
-16.0000000 0.0736311 9.9631097893e-01 4.9477653557e-05
-16.0000000 0.0981748 9.9420658732e-01 6.5784269579e-05
csv.reader
初始值设定项的csvfile
参数"可以是支持迭代器协议并在每次调用其next()
方法时返回字符串的任何对象"。
这意味着您可以通过定义如下所示的生成器函数来读取文件,以预处理文件的行以使其被csv.reader
接受:
import csv
def preprocess(file):
for line in file:
yield ','.join(line.split())
values = []
with open('cppfile.txt') as file:
fieldreader = csv.reader(preprocess(file))
next(fieldreader)
for row in fieldreader:
print(f'row={row}')
values.append(float(row[0]))
print()
print(values)
输出:
row=['-16.0000000', '0.0000000', '9.9901854997e-01', '1.0910677716e-19']
row=['-16.0000000', '0.0245437', '9.9871759471e-01', '1.6545142956e-05']
row=['-16.0000000', '0.0490874', '9.9781493216e-01', '3.3051500271e-05']
row=['-16.0000000', '0.0736311', '9.9631097893e-01', '4.9477653557e-05']
row=['-16.0000000', '0.0981748', '9.9420658732e-01', '6.5784269579e-05']
[-16.0, -16.0, -16.0, -16.0, -16.0]
我会选择pandas,这是一个了不起的第三方库,提供高性能,易于使用的数据结构和数据分析工具,以解析您提到的生成的文件:
示例.txt
# z phi phi1 Massless
-16.0000000 0.0000000 9.9901854997e-01 1.0910677716e-19
-16.0000000 0.0245437 9.9871759471e-01 1.6545142956e-05
-16.0000000 0.0490874 9.9781493216e-01 3.3051500271e-05
-16.0000000 0.0736311 9.9631097893e-01 4.9477653557e-05
-16.0000000 0.0981748 9.9420658732e-01 6.5784269579e-05
test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pandas as pd
if __name__ == "__main__":
df = pd.read_csv("test.txt", sep=r's+', skiprows=1, names=["z", "phi", "phi1", "Massless",])
print(df)
运行命令后,如下所示:
python test.py
我得到了以下结果:
z phi phi1 Massless
0 -16.0 0.000000 0.999019 1.091068e-19
1 -16.0 0.024544 0.998718 1.654514e-05
2 -16.0 0.049087 0.997815 3.305150e-05
3 -16.0 0.073631 0.996311 4.947765e-05
4 -16.0 0.098175 0.994207 6.578427e-05
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- 是否可以使用 Python csv 阅读器读取使用 C++ std::setw 生成的文件?
- 为什么 std:: setw 和 std::hex 不适合下面的代码?
- 如何理解 C++ std::setw 的不一致行为?
- STD :: SETW,STD :: SETFILL等的真实返回类型是什么?
- std::setfill 和 std::setw 用于输入流?
- std::setw 对于整个运算符<<用户定义类型
- std::hex 和 std::setw 不适用于某些字符
- std::setw() 将特殊字符视为两个字符
- 使用 std::setw 后,如何清除从流输出时的宽度
- std::setw() 在我的数组末尾插入一个 0
- 使用 std::setw 在 std::cin 中限制输入大小
- 如何在C++中打印此模式而不使用“std::setw”、“std:;left”和“std::right”
- 与std::stringstream一起使用时,std::setw出现意外行为
- 拥有"std::ios_base::width()"和"std::setw()"有什么意义?