在python中从.dat文件读取和执行计算

在python中从.dat文件读取和执行计算,python,csv,Python,Csv,我需要用python读取一个.dat文件,它总共有12列和数百万行。我需要将第2、3和4列除以第1列进行计算。因此,在加载该.dat文件之前,是否需要删除所有其他不需要的列?如果不是,我如何有选择地声明该列并让python进行计算 .dat文件的一个示例是 我是python新手,所以如果您能给我一些关于打开、阅读和计算的指导,我将不胜感激 我已根据您的建议添加了我正在用作启动程序的代码: from sys import argv import pandas as pd script,

我需要用python读取一个.dat文件,它总共有12列和数百万行。我需要将第2、3和4列除以第1列进行计算。因此,在加载该.dat文件之前,是否需要删除所有其他不需要的列?如果不是,我如何有选择地声明该列并让python进行计算

.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
回溯(最近一次呼叫最后一次):
文件“flash.py”,第18行,在
dataframe=pd.read\u csv(“~/Pictures”,delimiter=“,”,usecols=columns\u to\u keep)
parser\u f中的文件“/home/trina/anaconda2/lib/python2.7/site packages/pandas/io/parsers.py”,第529行
返回读取(文件路径或缓冲区,kwds)
文件“/home/trina/anaconda2/lib/python2.7/site packages/pandas/io/parsers.py”,第295行,已读
parser=TextFileReader(文件路径或缓冲区,**kwds)
文件“/home/trina/anaconda2/lib/python2.7/site packages/pandas/io/parsers.py”,第612行,在__
自制发动机(自制发动机)
文件“/home/trina/anaconda2/lib/python2.7/site packages/pandas/io/parsers.py”,第747行,在“make”引擎中
self.\u engine=CParserWrapper(self.f,**self.options)
文件“/home/trina/anaconda2/lib/python2.7/site packages/pandas/io/parsers.py”,第1119行,在__
self.\u reader=\u parser.textleader(src,**kwds)
文件“pandas/parser.pyx”,第518行,在pandas.parser.TextReader.\u uu-cinit\uuuuu(pandas/parser.c:5030)中

ValueError:没有要从文件中分析的列
尝试以下方法:

datContent = [i.strip().split() for i in open("filename.dat").readlines()]
然后,您将在列表中显示数据


如果您想使用更复杂的东西,请参阅链接的烹饪书。

查看您的
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

考虑使用常规函数(其中,
read\u csv()
是一种特殊类型),熊猫可以轻松导入指定空格分隔符的特定.dat文件,
sep='\s+'
。此外,逐列计算不需要使用
apply()
定义的函数

下面的numpy用于设置被零除的条件。此外,example.dat文件的第一列是#time,第2、3、4列是x动量、y动量和质量(代码中的表达式不同,但需要修改)


这里面临的问题是列标题名称中有空格。你需要修正/忽略这一点,才能使熊猫表现良好。这将根据字段名称字符串的固定长度将列标题名称读入列表:

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']
现在您可以访问dat文件

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

然后您可以将其用作csv文件。

我认为
分隔符不能是
@ppaulojr根据文档,,”是默认值。我只是把它包括在内,所以很明显它可以更改是的,但是因为你正在做一个函数示例,所以使用正确的分隔符来表示他的caseValueError是很有趣的:没有要从文件中解析的列,这就是我在执行代码时遇到的错误,有什么帮助吗?@bhjghjh查看了你的flash.dat,已使用完整的工作解决方案进行更新我猜
“~/Pictures”
不包含您要查找的数据。尝试读取正确的文件。我检查了my~/Pictures文件夹中的.dat和.py。您是否希望
pandas.read_csv
猜测要打开哪个文件?请尝试
pd.read\u csv(“~/Pictures/data.dat”,delimiter=“,”,usecols=columns\u to\u keep)
。或者,删除
txt.read()
并将
txt
作为第一个参数传递给
read\u csv
。谢谢,我没有注意到,现在我有一个新错误,我是否也必须在这里定义标题?[ValueError:'x-momentum'不在列表中]@bhjghjgh该代码假定您的数据文件实际上有一个定义字段名的第一行“x-momentum”,等等。如果您的数据文件没有定义字段名的第一行,您可以将代码改为使用列索引,例如,columns_to_keep=[2,3,4,7]。或添加具有列名的第一行。
train=pd.read_csv("Path",sep=" ::",header=None)
train.columns=["A","B","C"]# Number of columns you can see in the dat file.