Можно ли читать файлы, созданные с помощью C ++ std :: setw, используя Python csv reader? - PullRequest
1 голос
/ 19 января 2020

У меня есть файл данных, сгенерированный с использованием 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 

Ответы [ 2 ]

1 голос
/ 19 января 2020

csvfile аргумент инициализатору csv.reader может быть любым объектом, который поддерживает протокол итератора и возвращает строку каждый раз, когда вызывается его метод 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]
0 голосов
/ 19 января 2020

Я бы выбрал pandas, замечательную стороннюю библиотеку, предоставляющую высокопроизводительные, простые в использовании структуры данных и инструменты анализа данных, для анализа созданных файлов, как вы упомянули:

example.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
...