(Python)与 RE 和 .txt 格式化有些麻烦

2024-09-24 12:21:52 发布

您现在位置:Python中文网/ 问答频道 /正文

这里有点小麻烦。手头的任务是解析.txt文件中的某些字符串。我正在使用RE来帮助解决这个问题,但这条线不起作用:

s = 'Qty'
for line in txtdoc:
    if s in line:
        quantity = re.search(':[1-9]', line)
        print(quantity.group())

以及要解析的文本(来自我的txtdoc文件中的一行):

stringstringQty:1stringstring

我应该看到打印的“:1”对吗?相反,它给出了一个错误,因为“quantity”变量为空。我也试过使用关于芬德尔它只打印了一个空集“[]”。你知道吗

现在,我想这可能与.txt文件的格式化有关,因为名义上我需要的数据是MS Word。我有一个脚本,将doc这个词保存为.txt,然后我尝试解析它。你知道吗

当我在这里尝试解析的行并将其复制/粘贴到Outlook或MS Word时,它会自动设置如下格式:

string
string
Qty:
1
string
string

所以在看到之后,我试着

re.search(r':/n[1:9]', line)

但这也不管用。有什么想法吗?我本想提供更多的代码,但我在工作中一直在做这个,回家后就一直在想这个问题,所以我不得不失去记忆。你知道吗


Tags: 文件字符串inretxtsearchstringline
1条回答
网友
1楼 · 发布于 2024-09-24 12:21:52

问题是你有一个Word.doc文件,而不是一个文本文件。你知道吗

Word文件本质上是一系列格式化文本。(实际上比这更复杂,它是一棵各种各样的树,其中一些是文本的运行,但现在让我们保持简单。)

在“经典”Word格式中,每个运行都是一个字节字符串。在现代(DOCX,又名office2007,又名officeopenxml,又名WordML)Word格式中,它们中的每一个都是树中的一个XML节点。但是不管怎样,如果一个运行以:结束,另一个运行以1开始,您都不会在文件中找到:1;您会发现:后跟一堆cruft(一个二进制对象的结尾和下一个二进制对象的开头,或者一个XML节点的结尾和下一个XML节点的开头,可能中间有其他对象/节点),然后是1。你知道吗

如果不真正解析单词格式,就没有好的方法来处理这个问题。你知道吗

所以,最大的问题是,你有哪种格式?你知道吗


如果是DOCX,那基本上只是一个XML文件,或者一个包含XML文件的ZIP文件,您可以用Python本地解析它,或者更好地,使用一个像^{}这样的模块为您完成所有的艰苦工作。你知道吗

如果它是经典文档,那么解析它的唯一方法就是阅读人们多年来编写的反向工程文档,并编写一些讨厌的代码来处理它。当然,你也可以用别人已经写过的代码。在本例中,我不知道任何python模块会有帮助,但是您可以通过subprocess非常轻松地控制^{}程序。你知道吗


或者,如果你有一个程序可以读取你机器上的文件,比如Windows上的Word或Wordpad/Write,或者Mac上的iWork页面,或者OpenOffice.org/Libre任何平台上的办公室,你都可以编写脚本。Python有很好的包装器,可以与Windows上的COM接口和Mac上的AppleScript接口进行通信,OO.o/Libre是为可编写脚本而构建的。你知道吗

This blog post是通过pywin32在Windows上使用Word处理文档文件的一个很好的例子。您可以使用它作为您自己的代码的起点,从每个文件中提取文本,或使Word用于搜索您,或仅保存每个文件的纯文本副本,然后您可以对其执行任何操作。网上还有成百上千的类似例子,还有类似的例子,比如用appscriptScriptingBridge在Mac上做等价的操作,或者用VBA代替Python从Word内部编写脚本等等。要知道编写Word脚本时有哪些功能可用,请参阅Word 2013 developer reference,如果没有,请参阅早期版本的类似文档有了2013,或者只要在AppleScript编辑器中“打开字典”,看看Word的字典,如果你有Mac的话。你知道吗

相关问题 更多 >