【问题标题】:Removing  from the text [duplicate]从文本中删除  [重复]
【发布时间】:2016-11-02 09:17:29
【问题描述】:

我正在使用 Python 将 word 文件转换为文本字符串。生成的文本字符串将项目符号点(在 word 文件中)转换为 (在转换后的字符串中)。如何使用 Python 从文本字符串中删除它,以便我只有没有这些框的文本字符串 ()。

from docx import Document

document = Document(file_to_read)

text_string = ''
for paragraph in document.paragraphs:
    text_string += paragraph.text+"\n"# -*- coding: utf-8 -*-

print text_string

输出如下:

 Computer Science fundamentals in data structures.

 Computer Science fundamentals in algorithm design, problem solving, and complexity analysis

【问题讨论】:

  • 您使用的是哪个工具? Openpyxl 适用于 Excel。
  • 对不起。为了阅读我正在使用的word文件:docx.
  • @Kristof 我已经添加了代码。
  • @BhargavRao 问题不在于输出字符串有 unicode 字符,而是其中有实际的正方形。
  • @SrinivasanA 当你在 Python2 上时,测试这个 Replace non-ASCII characters with a single space 并确认它是否有效。我重新打开了帖子。

标签: python python-2.7 ms-word python-docx


【解决方案1】:

您的尝试不会尝试删除字符。您可以使用replace方法来替换字符串中的字符,也可以使用它来删除字符,只需替换为空字符串。

唯一的问题是在源代码中正确表示 0xF0B7,正确的方法取决于 document.paragraphs 是包含普通字符串还是 unicode 字符串(我建议使用 python3 来避免 unicode 问题)。我假设它们是 unicode 字符串,然后您将代码点表示为 `u"\uF0B7" (如果它是普通字符串,那么它将取决于编码)。

除此之外,您的代码存在问题,因为您构建 text_string 的方式可能不是最佳的。从片段构建字符串的另一种方法是将片段放入列表中,然后使用"".join(l) 将它们连接起来。

把这些放在一起你会得到(假设document.paragraphs 是unicode 字符串):

from docx import Document

document = Document(file_to_read)

text_string = u"\n".join([p.replace(u"\uF0B7", u"") 
                          for p in document.paragraphs])

print(text_string)

如果您使用 python3,则必须在字符串之前删除 us(因为在 python3 中所有字符串都是 unicode)。另请注意,当printing 时,您必须确保您的编码支持文档中的所有字符(这可能是您首先要删除项目符号的原因)。

【讨论】:

  • 使用带有join 的列表推导而不是生成器表达式。这是因为join 对列表进行了两次迭代,因此在那里有一个列表而不是必须为第二次迭代重新创建的生成器更快。见Raymond Hettinger's answer
  • @BhargavRao 我以前不知道。感谢您指出这一点,我已经更新了我的答案。
  • 只是澄清 Bhargav Rao 的评论:生成器表达式不会运行两次,因为第二次可能会产生不同的结果。相反,.join 将 gen exp 的输出保存到一个列表中; Martijn 在他对链接的“可能重复”问题的回答中提到了这一点。
  • @PM2Ring Raymond Hettinger 的回答是肯定的。没有其他可能性(在 python 中),因为迭代器只能保证可以迭代一次。但是,行为不能是 join 创建一个列表,然后做同样的事情,就好像它被赋予一个列表开始一样 - 这需要三次迭代数据。相反,它可以在为第二次迭代构建列表的同时构建列表。顺便说一句,我猜join 也可以直接作用于元组。
  • @skyking:我很确定你是对的;我还没有检查.join 的源代码。而且我几乎可以肯定 .join 直接在元组上工作,没有(理智的)理由不这样做。
【解决方案2】:

如果您只想要英文字符,可以这样做:

text_string = text_string.decode('ascii', errors='ignore')

我认为最好的解决方案是准确识别导致问题的字节和replace

# -*- coding: utf-8 -*- 指定源文件的编码,而不是字符串的编码。

【讨论】:

    猜你喜欢
    • 2014-05-07
    • 2010-11-17
    • 2013-03-27
    • 2018-01-31
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多