重新格式化文本文件
Re-formatting a text file
我是 Python
的新手。我有一个文本文件,里面全是常见的拼写错误。单词的正确拼写以 $
字符为前缀,以及它前面单词的所有拼写错误版本;每行一个。
mispelling.txt
:
$year
eyar
yera
$years
eyars
eyasr
yeasr
yeras
yersa
我想根据 mispelling.txt
创建一个新的文本文件,格式如下:
new_mispelling.txt
:
eyar->year
yera->year
eyars->years
eyasr->years
yeasr->years
yeras->years
yersa->years
单词的正确拼写在其错误拼写的右侧,以->
分隔;在同一条线上。
问题:
如何读入文件,将 $
作为一个新词读取,从而在我的输出文件中读取一个新行,传播输出文件并保存到磁盘?
这样做的目的是让我收集的数据与 “所有” 常见拼写错误的单词的开源维基百科条目 dataset 具有相同的格式,不包含我自己的单词和拼写错误条目。
当您逐行处理文件时,如果您找到以 $
开头的单词,请将其设置为“当前活动的正确拼写”。然后每一行都是该单词的拼写错误,因此将其格式化为字符串并将其写入输出文件。
current_word = ""
with open("mispelling.txt") as f_in, open("new_mispelling.txt", "w") as f_out:
for line in f_in:
line = line.strip() # Remove whitespace at start and end
if line.startswith("$"):
# If the line starts with $
# Slice the current line from the second character to the end
# And save it as current_word
current_word = line[1:]
else:
# If it doesn't start with $, create the string we want
# And write it.
f_out.write(f"{line}->{current_word}\n")
对于您的输入文件,这会给出:
eyar->year
yera->year
eyars->years
eyasr->years
yeasr->years
yeras->years
yersa->years
f"{line}->{current_word}\n"
构造称为 f-string,用于 python 3.6+ 中的字符串插值。
正则表达式解决方案:
您可以使用模式 '$(\w+)(.*?)(?=$|$)'
并将以 $
开头的每个值与 ->
的后续值连接起来,然后通过 \n
将所有这些值连接到组中捕获,然后最后通过 \n
加入所有这些值。确保使用 re.DOTALL
标志,因为它是一个多行字符串:
import re
txt='''$year
eyar
yera
$years
eyars
eyasr
yeasr
yeras
yersa'''
print('\n'.join('\n'.join('->'.join((v, m.group(1)))
for v in m.group(2).strip('\n').split('\n')) for m in
re.finditer('$(\w+)(.*?)(?=$|$)', txt, re.DOTALL)))
输出:
eyar->year
yera->year
eyars->years
eyasr->years
yeasr->years
yeras->years
yersa->years
我要为你留下文件 read/write,假设这不是你要问的问题
我是 Python
的新手。我有一个文本文件,里面全是常见的拼写错误。单词的正确拼写以 $
字符为前缀,以及它前面单词的所有拼写错误版本;每行一个。
mispelling.txt
:
$year
eyar
yera
$years
eyars
eyasr
yeasr
yeras
yersa
我想根据 mispelling.txt
创建一个新的文本文件,格式如下:
new_mispelling.txt
:
eyar->year
yera->year
eyars->years
eyasr->years
yeasr->years
yeras->years
yersa->years
单词的正确拼写在其错误拼写的右侧,以->
分隔;在同一条线上。
问题:
如何读入文件,将 $
作为一个新词读取,从而在我的输出文件中读取一个新行,传播输出文件并保存到磁盘?
这样做的目的是让我收集的数据与 “所有” 常见拼写错误的单词的开源维基百科条目 dataset 具有相同的格式,不包含我自己的单词和拼写错误条目。
当您逐行处理文件时,如果您找到以 $
开头的单词,请将其设置为“当前活动的正确拼写”。然后每一行都是该单词的拼写错误,因此将其格式化为字符串并将其写入输出文件。
current_word = ""
with open("mispelling.txt") as f_in, open("new_mispelling.txt", "w") as f_out:
for line in f_in:
line = line.strip() # Remove whitespace at start and end
if line.startswith("$"):
# If the line starts with $
# Slice the current line from the second character to the end
# And save it as current_word
current_word = line[1:]
else:
# If it doesn't start with $, create the string we want
# And write it.
f_out.write(f"{line}->{current_word}\n")
对于您的输入文件,这会给出:
eyar->year
yera->year
eyars->years
eyasr->years
yeasr->years
yeras->years
yersa->years
f"{line}->{current_word}\n"
构造称为 f-string,用于 python 3.6+ 中的字符串插值。
正则表达式解决方案:
您可以使用模式 '$(\w+)(.*?)(?=$|$)'
并将以 $
开头的每个值与 ->
的后续值连接起来,然后通过 \n
将所有这些值连接到组中捕获,然后最后通过 \n
加入所有这些值。确保使用 re.DOTALL
标志,因为它是一个多行字符串:
import re
txt='''$year
eyar
yera
$years
eyars
eyasr
yeasr
yeras
yersa'''
print('\n'.join('\n'.join('->'.join((v, m.group(1)))
for v in m.group(2).strip('\n').split('\n')) for m in
re.finditer('$(\w+)(.*?)(?=$|$)', txt, re.DOTALL)))
输出:
eyar->year
yera->year
eyars->years
eyasr->years
yeasr->years
yeras->years
yersa->years
我要为你留下文件 read/write,假设这不是你要问的问题