【问题标题】:How to pass a .txt file to a function in Python?如何将 .txt 文件传递​​给 Python 中的函数?
【发布时间】:2020-03-28 15:06:49
【问题描述】:

我被要求创建一个函数,该函数接受一个字符串参数,创建并返回一个元组,其中包含由字符串指定的人员的详细信息(例如,名字、第二名和薪水)。该字符串具有以下布局:名字,名字,薪水。然后,我必须创建另一个函数,该函数将元组作为参数,并使用以下布局在单行的固定宽度字段中打印有关人员的详细信息:薪水、名字、名字。值得一提的是,字符串必须取自用户提供的文件输入。这是我尝试过的:

file = input('Insert a file:')

try:
    fin = open(file)
except IOError as a:
    fin = None
    print('Failed to open', file)

def person(fin):
    my_str = open('fin', 'r').read()
    print(tuple(my_str))

任何形式的帮助都将不胜感激,因为我完全迷失了。提前谢谢你。

【问题讨论】:

  • 您是否希望将文件名传递给程序?还是函数?
  • open('fin', 'r') 部分没有意义,因为您可能没有名为“fin”的文件,但变量 fin 中已经打开了一个文件对象。
  • @fiacre 好吧,我必须在程序中打开文件,然后传递给函数#1,该函数将内容作为字符串,然后将其转换为元组。然后函数 #2 必须在单行上以固定宽度字段输出元组的内容。
  • @MichaelButscher 是的,你是对的。我尝试使用 open(fin, 'r') 但它给了我一个错误。

标签: python string function file tuples


【解决方案1】:

您需要在您的try 语句中写入fin = open(file, "wt")。末尾的wt 表示你write 使用text(你也可以用二进制写)

稍后您需要输入my_str = open(fin, 'r'),因为fin 是一个对象,而不是实际文件的名称

【讨论】:

  • 他在读文件——不是写。不需要“wt”“w”就足够了。 fin 是一个文件对象——不是一个变量。
【解决方案2】:

让我们把这个任务转换成许多更小更容易解决的任务。

第一个函数

def string_to_tuple(person_string):
    """ Converts a string into a tuple.
    person_string must be in the following format: "first_name last_name salary"
    A tuple of the following format is returned: (first_name, last_name, salary)
    salary must be an int. If it can be a float change int to float

    e.g.
    >>> string_to_tuple("John Miller 100")
    ('John', 'Miller', 100)
    """
    first_name, last_name, salary = person_string.split(" ")
    return first_name, last_name, int(salary)

这个函数接受一个字符串在空格处分割它并返回一个元组。请注意,没有进行错误检查。您应该稍后检查输入是否有效。

第二个功能

def tuple_to_string(person_tuple):
    """Converts a tuple with person data into a string. This is is inverse function to `string_to_tuple`.

    person_tuple must be in the following format: (first_name, last_name, salary)
    A string of the following format is returned: "first_name last_name salary"

    e.g.
    >>> string_person = "John Miller 100"
    >>> string_person_2 = tuple_to_string(string_to_tuple(string_person))
    >>> string_person == string_person_2
    True
    >>> tuple_to_string(('John', 'Miller', 100))
    'John Miller 100'
    """
    string_person = " ".join(str(i) for i in person_tuple)
    return string_person

在这里,您将一个元组连接回一个字符串。在加入之前,您需要将每个项目转换为字符串 (str(i))。

从文件中读取

要阅读,您应该使用with。这可确保文件在不再使用时始终关闭。

打开文件:

path_to_file = "my_file.txt"
with open(path_to_file, "r") as file:
    content = file.read() # alternatives: file.readlines() or file.readline()

print(content) # To ensure the content was correctly read. Not needed in the later application

文件的路径必须相对于您当前的工作目录(脚本所在的位置)或绝对路径。

文件和路径的区别

文件的路径 (path_to_file) 和实际打开的文件 (file) 之间存在差异。路径可以由用户输入,您必须使用它来打开文件。用户无法输入文件对象。

>>> type(path_to_file)
<class 'str'>
>>> type(file)
<class '_io.TextIOWrapper'>

一个更容易理解的比较可能如下: 想想一个公共图书馆:图书馆有书,每本书都有一个标题。如果你想读一本书,你需要按书名找到这本书,拿一个样本打开它阅读。在此示例中,书名文件名文件

从文件中读取并调用函数

现在最后一步是将所有东西放在一起。所以首先从文件中读取,然后调用之前创建的函数。读取取决于您的文件结构。我只是假设您在每一行中都有一个新人的数据。

with open(path_to_file, "r") as file:
    for line in file.readlines():
        tuple_person = string_to_tuple(line)
        print(tuple_person) # verify output

如果您对某个部分有任何疑问,欢迎在 cmets 中提问。

编辑

根据文件内容调整

文件中的一行如下:切尔西右后卫大卫·扎帕科斯塔20,000,000

你需要扩展元组:

原文:first_name, last_name, salary

新:team, position, first_name, last_name, salary

注意:现在只需将薪水保留为 s 字符串,不要将其转换为 int 或 float。

原文:return first_name, last_name, int(salary)

新:return team, position, first_name, last_name, salary

原文:string_person = " ".join(str(i) for i in person_tuple)

新:string_person = " ".join(person_tuple)

资源

【讨论】:

  • 感谢您的帮助。该程序提供输出,但它也返回错误: Traceback (last most recent call last): File "C:/Users/abc/Desktop/test.py", line 39, in tuple_person = string_to_tuple(line) File "C:/Users/abc/Desktop/test.py",第 11 行,在 string_to_tuple 中 first_name, last_name,salary = person_string.split(" ") ValueError: too many values to unpack (expected 3)
  • 好的,我看到了你所做的改变,这很有意义。但是,我不是很了解代码部分...
  • @HristoGeorgiev 我想我知道问题所在,但要验证它,您可以将文件内容添加到您的问题中吗?问题是,该函数假定您输入的字符串格式完全一致,即由空格分隔的 3 个单词。
  • 哪些代码部分不明白?我可以尝试简化它们或更好地解释它们
  • 文件内容是关于玩家的。例如:切尔西右后卫大卫·扎帕科斯塔 20,000,000
【解决方案3】:

试试这个:

import argparse

def my_func(my_file): 
    with open(my_file_name, 'r') as f_obj:
        # do stuff with f_obj, like f_obj.read()

parser = argparse.ArgumentParser()
parser.add_argument('--infile', type=str, help='Name of file to read', required=True)
options = parser.parse_args()
input_file_name = options.infile

my_func(input_file_name)

【讨论】:

    【解决方案4】:

    在我的脑海中,fin 是一个变量,但你将它作为纯文本字符串传递

        my_str = open(fin, 'r').read()
    

    【讨论】:

    • 即使我尝试这样做,它也会给我一个错误:TypeError: expected str, bytes or os.PathLike object, not _io.TextIOWrapper
    • fin 是已经打开读取的文件缓冲区。不要再打开它——没有意义。
    猜你喜欢
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2020-08-26
    • 1970-01-01
    相关资源
    最近更新 更多