我正在尝试从许多docs文件中提取数据,并将其附加到数据框中。
我编写的代码在处理单个文件时效果很好,但是我似乎无法在数据框中追加更多文件。
import re
import docx2txt
import pandas as pd
import glob
df2=pd.DataFrame()
appennded_data=[]
for file in glob.glob("*.docx"):
text = docx2txt.process(file)
a1=text.split()
d2=a1[37]
doc2=re.findall("HB0....",text)
units2=re.findall("00[0-9]...",text)
df2['Units']=units2
df2['Doc']=doc2[0]
df2['Date']=d2
df2
这给出了一个错误 “值的长度与索引的长度不匹配”
预期输出-
从docx1 :(我知道)
Units | Doc | Date
001 | HB00001 | 23/4/12
002 | HB00001 | 23/4/12
003 | HB00001 | 23/4/12
004 | HB00001 | 23/4/12
005 | HB00001 | 23/4/12
来自docx2:
Units | Doc | Date
010 | HB00002 | 2/6/16
011 | HB00002 | 2/6/16
最终输出:
Units | Doc | Date
001 | HB00001 | 23/4/12
002 | HB00001 | 23/4/12
003 | HB00001 | 23/4/12
004 | HB00001 | 23/4/12
005 | HB00001 | 23/4/12
010 | HB00002 | 2/6/16
011 | HB00002 | 2/6/16
任何帮助将不胜感激
答案 0 :(得分:0)
错误是因为列的长度不同。在处理第二个文件时,它将尝试将列设置为与第一个文件具有不同长度的值。您不能为列分配与现有列不同的值。
由于您希望最终的df具有['Units', 'Doc', 'Date']
列,因此您可以创建一个空白df并将新结果附加到其上。使用ignore_index=True
仅将其追加到下面,而不尝试匹配行索引。
import re
import docx2txt
import pandas as pd
import glob
final_df = pd.DataFrame()
for file in glob.glob("*.docx"):
text = docx2txt.process(file)
a1 = text.split()
d2 = a1[37]
doc2 = re.findall("HB0....", text)
units2 = re.findall("00[0-9]...", text)
# because columns are different length, create them as separate df and concat them
df2 = pd.DataFrame()
unit_df = pd.DataFrame(units2)
doc_df = pd.DataFrame(doc2[0])
date_df = pd.DataFrame(d2)
# join them by columns. Any blanks will become NaN, but that's because your data has uneven lengths
df2 = pd.concat([df2, unit_df, doc_df, date_df], axis=1)
# at the end of the loop, append it to the final_df
final_df = pd.concat([final_df, df2], ignore_index=True)
print(final_df)
答案 1 :(得分:0)
我的建议是首先使用内容构建字典,最后创建DataFrame:
import re
import docx2txt
import pandas as pd
import glob
columns = ['Units', 'Doc', 'Date']
data = {col: [] for col in columns}
for file in glob.glob("*.docx"):
text = docx2txt.process(file)
a1=text.split()
d2=a1[37]
doc2=re.findall("HB0....",text)
units2=re.findall("00[0-9]...",text)
data['Units'].extend(units2)
data['Doc'].extend(doc2[0])
data['Date'].extend(d2)
df2 = pd.DataFrame(data)