【问题标题】:How do I get python to write a csv file from the output my code?如何让 python 从我的代码输出中写入 csv 文件?
【发布时间】:2020-10-10 06:36:46
【问题描述】:

我对 python 非常陌生,所以我可能没有正确的术语...

我使用 pdfplumber 从 pdf 中提取了文本。这已被保存为对象。我使用的代码是:

with pdfplumber.open('Bell_2014.pdf') as pdf:
    page = pdf.pages[0]
    bell = page.extract_text()
    print(bell)

所以“bell”是导入 PDF 第一页的所有文本。 what bell looks like 我需要将所有文本作为字符串写入 csv。我尝试使用:

 with open('Bell_2014_ex.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerows(bell)

bell_ex = 'bell_2014_ex.csv'

with open(bell_ex, 'w', newline='') as csvfile:
   file_writer = csv.writer(csvfile,delimiter=',')
   file_writer.writerow(bell)

当我搜索此内容时,我一直在寻找的只是如何创建具有特定字符或数字的 csv,但从已经执行的代码的输出中却一无所获。比如我可以得到上面的代码:

bell_ex = 'bell_2014_ex.csv'

with open(bell_ex, 'w', newline='') as csvfile:
   file_writer = csv.writer(csvfile,delimiter=',')
   file_writer.writerow(['bell'])

创建一个在 csv 的一个单元格中具有“bell”的 csv,但这是我所能得到的。 我觉得这应该非常容易,但我似乎无法让它发挥作用。 有什么想法吗? 请并感谢您帮助我没有经验的自己。

【问题讨论】:

  • 我们不知道bell 长什么样。你能发布print(bell) 的输出吗?或者,因为它可能比我们需要的更长,所以是一个修整的版本?
  • 嗨!我添加了它的屏幕截图
  • 这看起来像一个多行字符串。不是“数据框”(您必须澄清这是什么,流行的pandas.DataFrame 或其他东西)。 CSV 用于柱状数据,我没有看到任何柱状数据。
  • 感谢您的澄清,我更正了我的帖子说对象而不是数据框。
  • @DMM。题外话,但您实际上应该接受您问题的有效答案。这是简单的礼貌和这个网站works

标签: python csv output export-to-csv


【解决方案1】:

page.extract_text() 定义为:“将页面的所有字符对象整理成一个字符串。”这将使bell 只是一个很长的字符串。

默认情况下,CSV writerow() 需要一个字符串列表,列表中的每个项目对应一个列。

您的主要问题是类型不匹配,您试图在需要字符串列表的位置编写单个字符串。您将需要对 bell 对象进行进一步操作,以将其转换为可接受的格式以写入 CSV。

在不知道 bell 包含什么或您打算写什么的情况下,我无法获得更具体的信息,但是 Python 的 CSV 模块的文档在设置分隔符、方言、列定义等方面非常全面. 将bell 转换为适当的可迭代字符串列表后,您就可以将其写入CSV。

【讨论】:

  • 我回过头来添加了一个“铃铛”外观的屏幕截图。很长,因为都是第一页的文字,所以我剪掉了。
  • 那张截图只是强化了bell 是一个巨大的字符串。还缺少的是您所期望的。您的 CSV 是否打算只有一行和一列包含 bell 的值?如果是这种情况,那么 file_writer.writerow([bell]) 去掉引号就可以了。如果您预期的最终 CSV 结构更复杂,那么您需要定义该结构并将bell 操作到相应的 Python 可迭代对象中,然后再写入 CSV。每行一个列表,每列一个列表项。
  • 好的,这更有意义。我必须澄清我需要对 csv 做什么。 (我正在为我的论文学习这项技术,但没有任何实际培训,所以这对我来说是一个“边做边学”的情况。)真的谢谢你帮助我。
  • FWIW 你最好通过反向操作来理解这一点。获取任何电子表格并将其导出为 csv。使用 Python 的 CSV 阅读器将文件读入默认输出(列表列表)并在行级别和整体上检查它。当您看到 Python 输出的每一行与原始 csv 相关的内容时,您将能够对编写者在您想要写入数据时的期望进行建模。
【解决方案2】:

我最近编写的一些类似代码将制表符分隔的文件转换为 csv 以插入到 sqlite3 数据库中:

也许这会有所帮助:

    retval = ''
    mode = 'r'
    out_file = os.path.join('input', 'listfile.csv')

    """
    Convert tab-delimited listfile.txt to comma separated values (.csv) file
    """

    in_text = open(listfile.txt, 'r')
    in_reader = csv.reader(in_text, delimiter='\t')
    out_csv = open(out_file, 'w', newline='\n')
    out_writer = csv.writer(out_csv, dialect=csv.excel)

    for _line in in_reader:
        out_writer.writerow(_line)
    out_csv.close()

...就是这样,不太难

【讨论】:

  • 但是 OP 没有从 CSV 读取,所以这可能不适用。顺便说一句,您可以 out_writer.writerows(in_reader) 并避免使用 `for.
【解决方案3】:

所以我的问题是我缺少特殊字符的“encoding = 'utf-8'”,我的分隔符需要是空格而不是逗号。最终起作用的是:

from pdfminer.high_level import extract_text
object = extract_text('filepath.pdf')
print(object)

new_csv = 'filename.csv'

with open(new_csv, 'w', newline='', encoding = 'utf-8') as csvfile:
    file_writer = csv.writer(csvfile,delimiter=' ')
    file_writer.writerow(object)

但是,由于我的很多 pdf 不是真正的 pdf 而是扫描的,因此 csv 最终有很多奇怪的符号。这适用于我拥有的大约一半的pdf。如果你有真正的 pdf,那就太好了。如果没有,我目前正在尝试弄清楚如何将所有文本提取到由 pdf 中的标题分隔的 pandas 数据框中,因为 pdfminer 完美地提取了所有文本。 感谢所有提供帮助的人!

【讨论】:

    猜你喜欢
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    相关资源
    最近更新 更多