定义函数参数和列表迭代

Defining Function Arguments and List Iteration

提问人:user159 提问时间:9/6/2023 更新时间:9/6/2023 访问量:30

问:

我对 Python 非常陌生,但有 javascript 方面的经验。下面是我的程序的一部分,由于未定义“remove_comment_lines”中的参数“data”而未运行。我怎样才能在不使用“全局”的情况下定义数据并将其用作指定函数的参数,因为我的教授不允许这样做。

读取文件并返回字符串格式的行列表

def read_data(data):
    with open("in.dat", "r") as f:
        data = f.readlines()
    f.close()
    return data

read_data("in.dat")


# Takes a list of lines as input and returns a new list of lines with the 
# comment lines (the ones that begin with #) removed.
def remove_comment_lines(data):
    with open("in.dat", "w") as f1:
        for number, data in enumerate(data):
            if number not in [0,1,2]:
                f1.write(data)
    f1.close()

remove_comment_lines(data)

这是文件“in.dat”

# read from file data about one day 
# format: start_time:end_time:#steps
09.30AM:09.45AM:220
11.45AM:12.23PM:300
11.45AM:10.23AM:302
2.45PM:3.23PM:202
3.45PM:3.53PM:90
5.45PM:5.53PM:80
6.45PM:7.23PM:1000
10.45PM:10.53PM:102

我已经尝试了我能想到的一切。我希望函数打开文件“indat”并删除以“#”开头的行并返回一个由行分隔的列表。

Python 函数 参数 迭代

评论

0赞 Ulises Bussi 9/6/2023
data因为不需要输入。你可以这样做,然后当你调用这个函数时,你需要将这个函数的输出分配给一个变量,比如说:希望它有帮助。如果您有更多疑问,请告诉我read_dataread_data()data = read_data()
0赞 Swifty 9/6/2023
为什么删除前行,而只有前 2 行是注释;更一般地说,这假设注释总是在特定的行上;更改逻辑以将行写入文件。此外,第二个函数不会返回任何内容,而是将过滤后的行写入文件。if not line.startswith('#'):

答:

0赞 richard 9/6/2023 #1

with上下文管理器不要求您使用 。
您可以使用 to 移动到循环/文件的下一次迭代,而不是写入行。
https://onlinegdb.com/Fr3wQYvoD
f.close()if line.startswith('#'): continue

def read_data(data):
    with open("in.dat", "r") as f:
        data = f.readlines()
    return data

# Takes a list of lines as input and returns a new list of lines with the 
# comment lines (the ones that begin with #) removed.
def remove_comment_lines(data):
    with open("in.dat", "w") as f:
        for line in data:
            if line.startswith('#'): continue
            f.write(line)

# read file as list of lines and save to variable
data = read_data("in.dat")

# pass data to remove comment function
remove_comment_lines(data)
0赞 Swifty 9/6/2023 #2

如果您希望该函数返回行列表,如前所述,而不是清理文件,这里有一个工作函数:

def read_data_and_filter_out_comments(filename):
    with open(filename, "r") as f:
        return [line for line in f.readlines() if not line.startswith('#')]

out_data = read_data_and_filter_out_comments('in.dat')

# ['09.30AM:09.45AM:220\n', '11.45AM:12.23PM:300\n', '11.45AM:10.23AM:302\n', '2.45PM:3.23PM:202\n', '3.45PM:3.53PM:90\n', '5.45PM:5.53PM:80\n', '6.45PM:7.23PM:1000\n', '10.45PM:10.53PM:102']