我有一个包含csv格式文档的文件夹,扩展名为.arw。文件名为1.arw, 2.arw, 3.arw
...等。
我想编写一个读取所有文件,检查并用破折号/
替换正斜杠-
的代码。最后用替换的字符创建新文件。
我编写的代码如下:
for i in range(1,6):
my_file=open("/path/"+str(i)+".arw", "r+")
str=my_file.read()
if "/" not in str:
print("There is no forwardslash")
else:
str_new = str.replace("/","-")
print(str_new)
f = open("/path/new"+str(i)+".arw", "w")
f.write(str_new)
my_file.close()
但是我收到一条错误消息:
'str'对象不可调用。
如何使它适用于文件夹中的所有文件?显然我的for循环不起作用。
答案 0 :(得分:2)
这就是我要做的:
for i in range(1,6):
with open((str(i)+'.arw'), 'r') as f:
data = f.readlines()
for element in data:
element.replace('/', '-')
f.close()
with open((str(i)+'.arw'), 'w') as f:
for element in data:
f.write(element)
f.close()
这是从您的帖子中假设您知道自己有6个文件
如果您不知道有多少文件,可以使用OS模块在目录中查找文件。
答案 1 :(得分:1)
实际错误是,您用自己的同名变量替换了内置str
,然后尝试使用内置str()
。
简单地重命名变量可以解决当前的问题,但是您确实希望重构代码,以避免将整个文件读入内存。
import logging
import os
for i in range(1,6):
seen_slash = False
input_filename = "/path/"+str(i)+".arw"
output_filename = "/path/new"+str(i)+".arw"
with open(input_filename, "r+") as input, open(output_filename, "w") as output:
for line in input:
if not seen_slash and "/" in line:
seen_slash = True
line_new = line.replace("/","-")
print(line_new.rstrip('\n')) # don't duplicate newline
output.write(line_new)
if not seen_slash:
logging.warn("{0}: No slash found".format(input_filename))
os.unlink(output_filename)
使用logging
代替print
来显示错误消息会有所帮助,因为您将标准输出(print
输出)与诊断程序(logging
输出)分开了。还要注意诊断消息中如何包含我们在其中发现问题的文件的名称。
在检查了整个输入文件但没有发现任何斜线时返回并删除输出文件名是一种轻微的疣,但通常应该更有效。