如何解决如何读取和替换一列文本文件中的特定值?
我在一个文件夹中有大约 70000 个文本文件,其中包含一个由 5 列组成的表格,例如:
7 0.1 0.2 0.007 0.000077
7 0.6 0.8888 0.9 0.07
3 0.8 0.09999 0.87 0.6544444
1 0.0009 0.09 0.999 0.777777
6 0.2 0.333 0.222 0.33333
我想用“5”替换第一列中的数字“7”。为此,我编写了以下代码来读取文件夹中的文本文件,并将整个文本文件中的 7 更改为 5。
我的问题是如何仅将其应用于第一列而不是整个文本文件?
import glob
for filepath in glob.iglob('path to folder/*.txt',recursive=True):
with open(filepath) as file:
s = file.read()
s = s.replace('7','5')
with open(filepath,"w") as file:
file.write(s)
解决方法
The fileinput
module 有一个方便的 inplace
关键字参数。
from fileinput import input as fileinput
import glob
with fileinput(files=glob.iglob('path to folder/*.txt',recursive=True),inplace=True) as f:
for line in f:
fields = line.split('\t')
if fields[0] == '7':
line = '\t'.join(['5'] + fields[1:])
print(line,end='')
也许可以尝试不使用 inplace=True
,直到您确信这可以正常工作。
我只是假设您的列是制表符分隔的;将其调整为以空格分隔或简单地使用不同的分隔符(如逗号等)应该不会太难(如果您的输入是正确的 CSV,则可以改用 Python 的 csv
模块。)
我还假设您只想将 7
更改为 5
而不是例如777
到 555
。如果你想要那个,也许只是
# ...
fields[0] = fields[0].replace('7','5')
line = '\t'.join(fields)
# ...
如果您的列被不可预测的空格分隔,但字段长度在您替换时没有改变(就像这里,用单个字符替换单个字符),您可以使用
fields = line.split()
fields[0] = fields[0].replace('7','5')
line = fields[0] + line[len(fields[0]):]
,
尝试使用 list
理解和切片以及 str.replace
:
import glob
for filepath in glob.iglob('path to folder/*.txt',recursive=True):
with open(filepath) as file:
s = '\n'.join(['\t'.join([v.replace('7','5') if i == 0 else v for i,v in enumerate(i.split('\t'))]).rstrip() for i in file])
with open(filepath,"w") as file:
file.write(s)
,
我假设您的文件使用了某种分隔符,例如逗号或制表符。在这种情况下,您可以使用 CSV 模块读取文件,并在 csv.reader
函数调用的参数中使用适当的分隔符。
一旦你这样做了,你就可以以列方式获取值,并且一次只更新一列。
读取制表符分隔文件的示例代码片段如下:
with open(path,"r",encoding="utf-8") as file:
rows = csv.reader(file,delimiter="\t")
注意分隔符关键字参数
变量 rows 保存每一行的值,您可以使用列表索引为行选择一列,因为变量 rows 是一个嵌套列表。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。