我正在尝试读取大型csv文件并运行代码。我使用块大小来做同样的事情。
file = "./data.csv"
df = pd.read_csv(file, sep="/", header=0,iterator=True, chunksize=1000000, dtype=str)
print len(df.index)
我在代码中收到以下错误:
AttributeError: 'TextFileReader' object has no attribute 'index'
如何解决这个问题?
答案 0 :(得分:3)
这些错误源于这样一个事实:在这种情况下,pd.read_csv
调用不会返回DataFrame
个对象。相反,它返回TextFileReader
对象,即iterator
。这基本上是因为当您将iterator
参数设置为True
时,返回的内容不是DataFrame
;它是iterator
个DataFrame对象,每个对象都传递给chunksize
参数的整数(在本例中为1000000
)。
根据您的情况,您不能只调用df.index
,因为简单地说,iterator
对象没有index
属性。这并不意味着您无法访问DataFrames
内的iterator
。这意味着您要么必须遍历迭代器以一次访问一个DataFrame
,要么必须使用某种方式将所有DataFrames
连接成一个巨大的DataFrame
。 / p>
如果您考虑一次只使用一个DataFrame
,那么您需要执行以下操作来打印每个file = "./data.csv"
dfs = pd.read_csv(file, sep="/", header=0,iterator=True, chunksize=1000000, dtype=str)
for df in dfs:
print(df.index)
# do something
df.to_csv('output_file.csv', mode='a', index=False)
的索引:
DataFrames
这会将output_file.csv
保存到名为mode
的输出文件中。将a
参数设置为DataFrame
后,操作应附加到文件中。因此,不应该覆盖任何内容。
但是,如果您的目标是将所有DataFrame连接成一个巨型file = "./data.csv"
dfs = pd.read_csv(file, sep="/", header=0,iterator=True, chunksize=1000000, dtype=str)
giant_df = pd.concat(dfs)
print(giant_df.index)
,那么以下可能是更好的路径:
iterator
由于您已在此处使用iterators
参数,因此我假设您关注内存。因此,第一个策略是更好的策略。这基本上意味着您正在利用{{1}}在大型数据集的内存管理方面所带来的好处。
我希望这证明有用。