Python - 从文件夹中所有文件提取并修改特定行的文本部分
我想从一个文件夹里的很多文件中提取并修改特定的一行文字,但遇到了一些问题。
比如,第一个文件的内容可能是:
To: Bob
From: Bill
<Message> The eagle flies at midnight. <End Message>
第二条消息格式不同,但大致相同,依此类推。我想提取第三行,把'The eagle flies at midnight.'通过一个函数(比如base64)处理一下,然后再把它放回到'消息'和'结束消息'之间。最终的输出应该是:
To: Bob
From: Bill
<Message> VGhlIGVhZ2xlIGZsaWVzIGF0IG1pZG5pZ2h0Lg== <End Message>
这是我目前尝试(和调整)的内容。
import base64
import os
import io
#ask user where his stuff is / is going
directory = raw_input("INPUT Folder:")
output = raw_input("OUTPUT Folder:")
#get that stuff
myfilepath = os.path.join(directory, '*.txt')
with open('*.txt', 'r') as file:
data = file.readlines()
#Go to line 3 and take out non encoded text.
data[3] = X
X.strip("<Message>")
X.strip("<End Message>")
coded_string = X
#Encode line 3
base64.b64encode(coded_string)
data[3] = '<Message> %s <End Message>' % (coded_string)
# and write everything back
with open('*.txt', 'w') as file:
file.writelines(data)
我相信这里面有很多问题,特别是在打开文件和写回内容的部分。额外加分:这个文件夹里99%的消息都是这个确切的格式,但有1%的垃圾消息(它们不需要编码,第三行的内容也不同)。我对这些不太担心,但如果在处理过程中能不影响它们就更好了。也许如果从0开始计数,第三行应该是第二行……
编辑:正在尝试
import re, base64
import os
folder = 'C:/Users/xxx/Desktop/input'
matcher = re.compile("<Message>(?P<text>[^<]*)<End Message>")
for filename in os.listdir(folder):
infilename = os.path.join(folder, filename)
if not os.path.isfile(infilename): continue
base, extension = os.path.splitext(filename)
filein = open(infilename, 'r')
fileout = open(os.path.join(folder, '{}_edit.{}'.format(base, extension)), 'w')
for line in filein:
match = matcher.search(line)
if match:
fileout.write("<message> " + base64.b64encode(match.group('text').strip()) + " <End message>\n")
else:
fileout.write(line)
filein.close()
fileout.close()
最终,这让我得到了一堆空文件,只有最后一个文件的内容被正确翻译了。
1 个回答
2
你可以使用正则表达式来简化操作,像这样:
import re, base64
filein = open("examplein.txt", 'r')
fileout = open("exampleout.txt", 'w')
matcher = re.compile("<Message>(?P<text>[^<]*)<End Message>")
for line in filein:
match = matcher.search(line)
if match:
fileout.write("<message> " + base64.b64encode(match.group('text').strip()) + " <End message>\n")
else:
fileout.write(line)
filein.close()
fileout.close()
这段代码只适用于一个文件,你需要修改它,让它能处理你目录下的所有文件:
import re, base64
import os
folder = '/home/user/Public'
matcher = re.compile("<Message>(?P<text>[^<]*)<End Message>")
for filename in os.listdir(folder):
infilename = os.path.join(folder, filename)
if not os.path.isfile(infilename): continue
base, extension = os.path.splitext(filename)
filein = open(infilename, 'r')
fileout = open(os.path.join(folder, '{}_edit.{}'.format(base, extension)), 'w')
for line in filein:
match = matcher.search(line)
if match:
fileout.write("<message> " + base64.b64encode(match.group('text').strip()) + " <End message>\n")
else:
fileout.write(line)
filein.close()
fileout.close()
这段代码在我的电脑上可以正常运行