使用python我需要读取一个文件并确定所有行是否都是相同的长度。如果他们是我将文件移动到"好"文件夹,如果它们的长度不同,我会把它们移到一个“坏”的文件夹中。文件夹并写一个单词doc,说明哪一行与其余行不同。任何帮助或方法开始?
答案 0 :(得分:0)
您应该使用all()
:
with open(filename) as read_file:
length = len(read_file.readline())
if all(len(line) == length for line in read_file):
# Move to good folder
else:
# Move to bad folder
由于all()
正在短路,它将在第一次不匹配时停止读取文件。
答案 1 :(得分:-1)
首先,您可以在此处example.txt
阅读该文件并将所有行放入列表content
:
with open(filename) as f:
content = f.readlines()
接下来,您需要修剪一行中的所有换行符并将其放在另一个列表中result
:
for line in content:
line = line.strip()
result.append(line)
现在获得每个句子的长度并不难,而且由于你想要的是坏的行,你可以遍历列表:
for line in result:
lengths.append(len(line))
因此result
的第i个元素的长度为lengths
的第i个元素。我们可以为列表中出现的行长度做一个计数器,它就像一行一样简单!
most_occuring = max(set(lengths), key=lengths.count)
现在我们可以制作另一个for-loop
来检查哪些长度与最常见的长度不对应,并将其添加到bad-lines
:
for i in range(len(lengths)):
if (lengths[i] != most_occuring):
bad_lines.append([i, result[i]])
下一步是检查文件需要去的位置,好文件夹或坏文件夹:
if len(bad_lines == 0):
#Good file, move it to the good folder, use the os or shutil module
os.rename("path/to/current/file.foo", "path/to/new/desination/for/file.foo")
else:
#Bad file, one or more lines are bad, thus move it to the bad folder
os.rename("path/to/current/file.foo", "path/to/new/desination/for/file.foo")
最后一步是将坏行写入另一个文件,这是可行的,因为我们在列表bad_lines
中已经存在坏行:
with open("bad_lines.txt", "wb") as f:
for bad_line in bad_lines:
f.write("[%3i] %s\n" % (bad_line[0], bad_line[1]))
它不是doc文件,但我认为这是一个不错的开始。如果您真的想写入doc文件,可以查看docx模块。
编辑:这是一个示例python脚本。
with open("example.txt") as f:
content = f.readlines()
result = []
lengths = []
#Strip the file of \n
for line in content:
line = line.strip()
result.append(line)
lengths.append(len(line))
most_occuring = max(set(lengths), key=lengths.count)
bad_lines = []
for i in range(len(lengths)):
if (lengths[i] != most_occuring):
#Append the bad_line to bad_lines
bad_lines.append([i, result[i]])
#Check if it's a good, or a bad file
#if len(bad_lines == 0):
#Good File
#Move file to the good folder...
#else:
#Bad File
with open("bad_lines.txt", "wb") as f:
for bad_line in bad_lines:
f.write("[%3i] %s\n" % (bad_line[0], bad_line[1]))