1

这只有 30 行长,所以我会发布整个内容。整个脚本应该采用另一个 .py 文件并重写它,使其完全在一行上。我遇到的一个问题是,如果脚本有任何注释,它会注释掉所有其他“行”。不起作用的部分用# *这是不起作用的部分*该部分应该做的是删除该行上的 # 字符及其后面的所有内容,但它似乎没有做什么都没有。

from sys import argv

script, input_file = argv

def make_one_line(f):
    # reads the file, then adds each line to a list
    # then adds that line to 'final'
    one_line = ''
    text_body = f.read()
    f.seek(0)
    lines = text_body.splitlines()
    lines.reverse() # this is done because pop() starts at the back
    # ****THIS IS THE PART THAT DOESN'T WORK****
    for line in lines:
        line.split("#")
    # ****THIS IS THE PART THAT DOESN'T WORK****
    while lines != []:
        next_one = lines.pop()
        one_line += next_one
        one_line += ';'
    return one_line


print "This will rewrite the file, press CTRL-C to cancel."
raw_input('Press any key (but CTRL-C) to continue.')

current_file = open(input_file, 'r+')
final = make_one_line(current_file)
current_file.truncate()
current_file.seek(0) # if this isn't here, you get an error on Windows
current_file.write(final)
4

3 回答 3

2

str.split 是一个返回拆分元素的函数。它不会修改其参数,因为字符串是不可变的。您也无法使用 for 循环写入您正在迭代的列表。而是考虑:

uncommented_lines = []
for line in lines:
    uncommented_lines.append(line.split('#')[0])
于 2013-09-06T23:48:01.307 回答
2

以@Steve 的回答为基础,他指出字符串是不可变的。还有任何理由使用read(),splitlines()reverse()pop()?这行不通:

def make_one_line(f):
    uncommented_lines = (line.rstrip('\n').split('#')[0] for line in f) 
    return ';'.join(uncommented_lines)
于 2013-09-07T00:33:09.577 回答
0

这可以用更少的代码和更有效的方式完成您想要的:

import fileinput

print ';'.join(line.strip('\n ').split('#')[0] for line in fileinput.input())

要测试,请输入此代码make_one_line.py,然后执行以下操作:

python make_one_line.py other.py
于 2013-09-07T00:26:46.103 回答