чтение и выполнение вычислений из .dat-файла в python

Мне нужно прочитать файл .dat в python, который содержит всего 12 столбцов и миллионы строк строк. Мне нужно разделить столбцы 2,3 и 4 с столбцом 1 для моего расчета. Поэтому, прежде чем загружать этот .dat-файл, мне нужно удалить все остальные нежелательные столбцы? Если нет, как я могу выборочно объявить столбец и попросить python выполнить математику?

примером файла .dat будет data.dat

Я новичок в python, поэтому было бы полезно получить небольшую инструкцию по открытию, чтению и вычислению.

Я добавил код, который я использую в качестве стартера из вашего предложения:

from sys import argv import pandas as pd script, filename = argv txt = open(filename) print "Here's your file %r:" % filename print txt.read() def your_func(row): return row['x-momentum'] / row['mass'] columns_to_keep = ['mass', 'x-momentum'] dataframe = pd.read_csv('~/Pictures', delimiter="," , usecols=columns_to_keep) dataframe['new_column'] = dataframe.apply(your_func, axis=1) 

а также ошибка, через которую я получаю:

 Traceback (most recent call last): File "flash.py", line 18, in <module> dataframe = pd.read_csv('~/Pictures', delimiter="," , usecols=columns_to_keep) File "/home/trina/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 529, in parser_f return _read(filepath_or_buffer, kwds) File "/home/trina/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 295, in _read parser = TextFileReader(filepath_or_buffer, **kwds) File "/home/trina/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 612, in __init__ self._make_engine(self.engine) File "/home/trina/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 747, in _make_engine self._engine = CParserWrapper(self.f, **self.options) File "/home/trina/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 1119, in __init__ self._reader = _parser.TextReader(src, **kwds) File "pandas/parser.pyx", line 518, in pandas.parser.TextReader.__cinit__ (pandas/parser.c:5030) ValueError: No columns to parse from file 

5 Solutions collect form web for “чтение и выполнение вычислений из .dat-файла в python”

Посмотрев на файл flash.dat , вам ясно, что вам нужно немного очистить его перед его обработкой. Следующий код преобразует его в файл CSV:

 import csv # read flash.dat to a list of lists datContent = [i.strip().split() for i in open("./flash.dat").readlines()] # write it as a new CSV file with open("./flash.csv", "wb") as f: writer = csv.writer(f) writer.writerows(datContent) 

Теперь используйте Pandas для вычисления нового столбца.

 import pandas as pd def your_func(row): return row['x-momentum'] / row['mass'] columns_to_keep = ['#time', 'x-momentum', 'mass'] dataframe = pd.read_csv("./flash.csv", usecols=columns_to_keep) dataframe['new_column'] = dataframe.apply(your_func, axis=1) print dataframe 

Попробуйте что-нибудь вроде:

 datContent = [i.strip().split() for i in open("filename.dat").readlines()] 

Затем вы будете иметь свои данные в списке.

Если вы хотите иметь что-то более сложное, вы можете использовать Панды , см. Связанную кулинарию.

Рассмотрите возможность использования общей функции read_table() (из которой read_csv() является особым типом), где pandas может легко импортировать определенный .dat-файл с указанием разделителя пробелов, sep='\s+' . Кроме того, для вычисления столбцов по столбцам не требуется определенная функция с apply() .

Ниже numpy используется для условия деления на ноль. Кроме того, первый столбец примера .dat – это #time, а столбцы 2, 3, 4 – это x-импульс , y-импульс и масса (другое выражение в вашем коде, но при необходимости пересмотр).

 import pandas as pd import numpy as np columns_to_keep = ['#time', 'x-momentum', 'y-momentum', 'mass'] df = pd.read_table("flash.dat", sep="\s+", usecols=columns_to_keep) df['mass_per_time'] = np.where(df['#time'] > 0, df['mass']/df['#time'], np.nan) df['x-momentum_per_time'] = np.where(df['#time'] > 0, df['x-momentum']/df['#time'], np.nan) df['y-momentum_per_time'] = np.where(df['#time'] > 0, df['y-momentum']/df['#time'], np.nan) 

Проблема, с которой вы сталкиваетесь здесь, состоит в том, что имена заголовков столбцов имеют в них пробелы. Вам нужно исправить / проигнорировать это, чтобы pandas.read_csv вел себя хорошо. Это будет читать имена заголовков столбцов в списке на основе фиксированной длины строк имени поля:

 import pandas with open('flash.dat') as f: header = f.readline()[2:-1] header_fixed = [header[i*23:(i+1)*23].strip() for i in range(26)] header_fixed[0] = header_fixed[0][1:] # remove '#' from time # pandas doesn't handle "Infinity" properly, read Infinity as NaN, then convert back to infinity df = pandas.read_csv(f, sep='\s+', names=header_fixed, na_values="Infinity") df.fillna(pandas.np.inf, inplace=True) # processing df['new_column'] = df['x-momentum'] / df['mass'] 
 train=pd.read_csv("Path",sep=" ::",header=None) 

Теперь вы можете получить доступ к dat-файлу.

 train.columns=["A","B","C"]# Number of columns you can see in the dat file. 

то вы можете использовать это как файлы csv.

  • Сравнение строк в 2 текстовых файлах с различным количеством столбцов
  • Исправить недостающие строки в CSV-файле в Python
  • конвертировать csv в netcdf
  • Геокодирование с использованием Geopy и Python
  • Перечитайте файл с момента запуска после завершения чтения программы python
  • Преобразование CSV в JSON (в определенном формате) с использованием Python
  • Python: пропустить строки комментариев, отмеченные # в csv.DictReader
  • Разделение csv-файла с несколькими объектами с течением времени по времени
  • Что случилось с этой программой python, работающей на .csv?
  • Python Pandas read_csv пропускает строки, но сохраняет заголовок
  • Python Pandas Ошибка для токенизации данных
  • Python - лучший язык программирования в мире.