读取文件并查找所有行的长度是否相同

时间:2016-04-12 23:52:43

标签: python macos python-2.7 file operating-system

使用python我需要读取一个文件并确定所有行是否都是相同的长度。如果他们是我将文件移动到"好"文件夹,如果它们的长度不同,我会把它们移到一个“坏”的文件夹中。文件夹并写一个单词doc,说明哪一行与其余行不同。任何帮助或方法开始?

2 个答案:

答案 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]))