Python 如何在pandas中读取固定宽度格式的文本文件?

Python 如何在pandas中读取固定宽度格式的文本文件?,python,pandas,fixed-width,Python,Pandas,Fixed Width,我刚刚得到了熊猫的资料,正在琢磨如何读取文件。该文件来自WRDS数据库,是一直追溯到20世纪60年代的SP500成分列表。我检查了文件,无论我如何使用read\u csv导入它,我仍然无法正确显示数据 df = read_csv('sp500-sb.txt') df <class 'pandas.core.frame.DataFrame'> Int64Index: 1231 entries, 0 to 1230 Data columns: gvkeyx      from    

我刚刚得到了熊猫的资料,正在琢磨如何读取文件。该文件来自WRDS数据库,是一直追溯到20世纪60年代的SP500成分列表。我检查了文件,无论我如何使用
read\u csv
导入它,我仍然无法正确显示数据

df = read_csv('sp500-sb.txt')

df

<class 'pandas.core.frame.DataFrame'>
Int64Index: 1231 entries, 0 to 1230
Data columns: gvkeyx      from      thru     conm
                                        gvkey      co_conm
...(the column names)
dtypes: object(1)
df=read_csv('sp500-sb.txt'))
df
INT64索引:1231个条目,0到1230
数据列:通过conm发送的gvkeyx
gvkey公司
…(列名称)
数据类型:对象(1)

上面的输出块是什么意思?任何东西都会有帮助。

你说的显示是什么意思?
df['gvkey']
没有提供gvkey列中的数据吗

如果您要做的是将整个数据帧打印到控制台,那么请查看
df.to_string()
,但是如果列太多,则很难读取。默认情况下,如果列太多,Pandas不会打印整个内容:

import pandas
import numpy 

df1 = pandas.DataFrame(numpy.random.randn(10, 3), columns=['col%d' % d for d in range(3)] )
df2 = pandas.DataFrame(numpy.random.randn(10, 30), columns=['col%d' % d for d in range(30)] )

print df1   # <--- substitute by df2 to see the difference
print
print df1['col1']
print
print df1.to_string()
导入熊猫
进口numpy
df1=pandas.DataFrame(numpy.random.randn(10,3),columns=['col%d'%d,表示范围(3)中的d)])
df2=pandas.DataFrame(numpy.random.randn(10,30),columns=['col%d'%d,表示范围(30)中的d)])

打印df1韦斯在电子邮件中回答了我。干杯

这是一个固定宽度格式的文件(不以逗号或制表符分隔) 通常)。我意识到熊猫没有固定宽度的阅读器 R是的,尽管可以很容易地塑造一个。我会尽力的 做同时,如果您可以以另一种格式导出数据(如 csv——真正的逗号分隔)您将能够使用read_csv读取它。我 借助一些unix魔法,您可以将FWF文件转换为CSV文件 文件

我建议您在github上关注这个问题,因为您的电子邮件即将发布 从我的收件箱中消失:)

最好的, 韦斯


用户,如果您现在需要处理固定格式,可以使用以下方法:

def fixed_width_to_items(filename, fields, first_column_is_index=False, ignore_first_rows=0):
    reader = open(filename, 'r')
    # skip first rows 
    for i in xrange(ignore_first_rows):
        reader.next()
    if first_column_is_index:
        index = slice(0, fields[1])
        fields = [slice(*x) for x  in zip(fields[1:-1], fields[2:])]
        return ((line[index], [line[x].strip() for x in fields]) for line in reader)
    else:
        fields = [slice(*x) for x  in zip(fields[:-1], fields[1:])]
        return ((i, [line[x].strip() for x in fields]) for i,line in enumerate(reader)) 
下面是一个测试程序:

import pandas
import numpy
import tempfile

# create a data frame
df = pandas.DataFrame(numpy.random.randn(100, 5))
file_ = tempfile.NamedTemporaryFile(delete=True)
file_.write(df.to_string())
file_.flush()

# specify fields
fields = [0, 3, 12, 22, 32, 42, 52]
df2 = pandas.DataFrame.from_items( fixed_width_to_items(file_.name, fields, first_column_is_index=True, ignore_first_rows=1) ).T

# need to specify the datatypes, otherwise everything is a string
df2 = pandas.DataFrame(df2, dtype=float)
df2.index = [int(x) for x in df2.index]

# check
assert (df - df2).abs().max().max() < 1E-6
导入熊猫
进口numpy
导入临时文件
#创建数据帧
df=pandas.DataFrame(numpy.random.randn(100,5))
file=tempfile.NamedTemporaryFile(delete=True)
文件写入(df.to_string())
文件\uux.flush()
#指定字段
字段=[0,3,12,22,32,42,52]
df2=pandas.DataFrame.from\u items(固定的\u宽度\u到\u items(文件名,字段,第一列\u为\u index=True,忽略\u第一行\u行=1)).T
#需要指定数据类型,否则一切都是字符串
数据帧(df2,dtype=float)
df2.index=[df2.index中x的int(x)]
#检查
断言(df-df2).abs().max().max()<1E-6
如果您现在需要,这应该可以实现,但请记住,上面的函数非常简单,特别是它对数据类型没有任何作用。

pandas.read_fwf()
是在pandas 0.7.3()中添加的,用于处理固定宽度的文件


  • 熊猫可能吃掉了你的数据?你能显示文件的前几行吗?谢谢TR。我的数据文件是固定宽度格式…目前不受支持。韦斯已经优雅地添加到源代码问题列表中。您仍然可以访问WRDS吗?你应该有一个选项以csv格式输出文件。跟进答案。正在通过read_fwf()实现读取固定宽度格式。看见