【问题标题】:Panda passes wrong tableformat to csv熊猫将错误的表格格式传递给 csv
【发布时间】:2022-01-02 20:08:50
【问题描述】:

问题

我的问题是我想从几个 PDF 中提取表格。我可以把数据拿出来。只有写入 csv 文件不起作用。

我明白了: as it should not be

我希望它看起来如何 How it should look

我正在导入 pdfminer、os 和 pandas

我的代码

path='My_Path'
df_results = pd.DataFrame()
for file_name in os.listdir(path): #Loop on Files
    print(file_name)
    fp = open(path + file_name, 'rb')
    rsrcmgr = PDFResourceManager()
    laparams = LAParams()
    device = PDFPageAggregator(rsrcmgr, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    pages = PDFPage.get_pages(fp)
    
    for page in pages:
        print('Processing next page...')
        interpreter.process_page(page)
        layout = device.get_result()
       

        for lobj in layout:
            if isinstance(lobj, LTTextBox):               
                x, y, text = lobj.bbox[0], lobj.bbox[3], lobj.get_text()
              
                #print('At %r is text: %s' % ((x, y), text))
                #data= pd.Series(text)
                
                if x==50.520000749999994 and y==200.30424779999996: #x and y from console from print from line 39
                    collected_data = [text]
                    data_list = collected_data
                    #data = pd.Series(data_list)
                    print(data_list)
                    data= pd.DataFrame([data_list], columns=list('c'), )
                    df_results = df_results.append(data,ignore_index=False)                
                if x==405.599991 and y==187.82423730000002: #x and y from console from print from line 39
                    collected_data = [text]
                    data_list = collected_data
                    #data = pd.Series(data_list)
                    print(data_list)
                    data= pd.DataFrame([data_list], columns=list('d'), )
                    df_results = df_results.append(data,ignore_index=False)                
                if x==562.4399872500001 and y==187.82423730000002: #x and y from console from print from line 39
                    collected_data = [text]
                    data_list = collected_data
                    #data = pd.Series(data_list)
                    print(data_list)
                    data= pd.DataFrame([data_list], columns=list('f'), )
                    df_results = df_results.append(data,ignore_index=False)
                      
                    #print(collected_data)
print(df_results)
df_results.to_csv('coordinates_data.csv', index = False, sep=';', )

【问题讨论】:

    标签: python pandas dataframe pdf export-to-csv


    【解决方案1】:

    你没有说最后print(df_results)的输出是什么,但是如果你看它你会发现它打印出一个有很多行的数据框,每行只有一列。这就是为什么你的输出没有按照你想要的那样结构化。问题与格式化为 CSV 无关,而与将正确的内容放入 Pandas 数据框有关。一旦数据框中的内容正确,您应该可以轻松将其保存为 CSV。

    您的问题是 PDF 的结构使得视觉上的表格列实际上是独立的文本框。您一次处理一个,因此您一次获取一列数据,而不是一次获取一行数据,这就是 Pandas 数据框的设计使用方式。

    当遇到类似问题时,我发现先将所有数据组装成原生 python 数据类型(列表、字典),然后再转换成数据框更容易。在此示例中,我将从三个文本框(每个文本框都有一列的值)中获取您的三个列表,然后将它们组合起来。使用zip() 并行迭代所有三个列表(在表中逐行)或使用某种列表理解。目的是获得具有正确结构的列表列表,然后 Pandas 将在单个操作中从中构造数据框,并提供正确的数据框。

    附:如果最终交换了行和列,则很容易转置数据框!

    【讨论】:

    • 这是 print(df_results) 的输出:c ... f 0 Ausgewertetes 元素\nEbenheit Ø35,5\nEbenhei... ... NaN 0 NaN ... NaN 0 NaN .. 7.87! \n1.64\n9.90! \n7.87! \n1.64\n9.75\n4.18... 0 Ausgewertetes 元素\nEbenheit Ø35,5\nEbenhei... ... NaN ...
    • 您可以使用code 标签将预先格式化的文本放入 cmets - 上面那个没有多大意义,如图所示。还有一些方法可以说服打印数据框不要使用省略号 (...) 并实际打印完整的输出,这可能会提供更多信息:stackoverflow.com/questions/19124601/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多