我使用glob.iglob和read_csv迭代文件夹中的多个.txt文件。数据按月文件排列。目标是提取数据并合并为汇总的月度文件。文件的格式是相关的,但有些不一致(因此下面使用fUniv)。
for filename in glob.iglob('*file.txt'):
fUniv = open(filename, 'U')
df = pd.read_csv(fUniv,engine='c',low_memory=False)
fUniv.close()
mainBlock(df)
迭代效果很好。在文件中,有两组不同的列标题。我需要使用if-elif-else来区分这两种文件类型,这些文件根据特定列标题的存在来区分文件。
def mainBlock(df):
if 'x' in df.columns:
#do stuff
elif 'y' in df.columns:
#do different stuff
else:
#something is wrong
sys.exit('Script terminated.')
#append df to monthly file
with open(file, 'a') as s:
frame.to_csv(s, header=True, index_col=1, encoding='utf-8')
这也适用于特定阈值以下的文件大小。一旦文件大小超过400 MB,我就会遇到错误。
Error tokenizing data: C error out of memory
我试图使用几个线程(1)(2)中描述的chunksize迭代。我想出了这个......
for filename in glob.iglob('*file.txt'):
filesize = os.path.getsize(filename)
chunklimit = 100000000
fUniv = open(filename, 'U')
if filesize > chunklimit:
df = pd.read_csv(fUniv,engine='c',low_memory=False,iterator=True,
chunksize=chunklimit)
for chunk in df:
mainBlock(chunk)
fUniv.close()
虽然它可以很好地运行较小的文件,但在到达chunklimit阈值以上的文件时会出现以下错误。
'TextFileReader' object has no attribute 'columns'
我已经发现它可能正确地读取了初始块,但无法满足下一次迭代
for chunk in df:
mainBlock(df)
因为在发送到mainBlock的if-elif-else的块中没有要评估的列标题。
错误的解释是否正确?我该如何解决这个问题?此外,一旦传递了块,我是否必须在将它们附加到文件之前将它们连接起来?非常感谢任何帮助。