python:传递字符串而不是文件作为函数参数

Posted

技术标签:

【中文标题】python:传递字符串而不是文件作为函数参数【英文标题】:python: pass string instead of file as function parameter 【发布时间】:2012-04-02 01:17:10 【问题描述】:

我是python的初学者,我需要使用一些第三方函数,它基本上只有一个输入 - 硬盘驱动器上的文件名。这个函数解析文件然后处理它。

我在我的代码中生成文件内容(它是我从列表中生成的 CSV 文件)并且想要跳过实际的文件创建。有什么方法可以实现这一点并“破解”第三方函数以在不创建文件的情况下接受我的字符串?

经过一番谷歌搜索后,我找到了 StringIO,并在其中创建了一个文件对象,现在我坚持将这个对象传递给一个函数(同样,它接受的不是文件对象而是文件名)。

【问题讨论】:

如果您可以访问第三方模块的源代码(很可能),另一种解决方案是修补第三方代码并删除限制。当然,最终的解决方案是写信给第三方开发者并要求他们为你做这件事(也为了其他人的利益。) 它做了什么样的处理?已经有一个用于基本 CSV 处理的内置标准库模块。 @Karl Knechtel:它使用多种机器学习算法,基于来自 csv 的数据进行大量复杂的计算。 @GrayR:所以你有或者你没有访问第 3 方模块的源代码? 【参考方案1】:

您似乎需要将数据写入文件,然后将该文件的名称传递给第 3 方库。您可能需要考虑使用tempfile 模块以安全且简单的方式创建文件。

【讨论】:

是的,这是一个简单的解决方案,但是我的程序每秒会写入几个 100kB 的文件。 tempfile 是一个很好的建议,谢谢,但它仍然会创建一个文件:(【参考方案2】:

如果它需要一个文件名,那么你将不得不创建一个文件。 (图书馆创建者的设计很糟糕。)

【讨论】:

它使用文件名,而不是实际文件。 感谢您的帮助。我认为对我来说是个坏消息。还发现了一个叫做 pywinfuse 的东西,但根据评论它被认为很慢。 如果您有 很多 数据要处理,或者需要非常 快,您可以创建一个 RAM 磁盘并创建文件完全在记忆中。 (提示:除非执行时间 > 1 小时,或者它必须是实时的,否则它不需要那么快。) @Li-aung Yip 您的提示中的两个条件均有效。感谢您的回复,将尝试按照此处的建议查看 PyFilesystem link 你找到了和我一样的链接,这意味着你一定尝试过同样的谷歌搜索。 ;) 但是请注意,操作系统确实对磁盘 I/O 进行了一些缓存,并且使用 RAM 磁盘实际上可能会破坏这一点。如果您最终使用了 RAM 磁盘,请在前后对代码进行基准测试,以确保它确实让事情变得更快(而不是更慢)。【参考方案3】:

您应该查看有关 I/O 的 python 文档,如下所示: http://docs.python.org/tutorial/inputoutput.html

Python 通过打开文件来处理文件,没有“创建”额外的文件。然后打开的文件有一些方法可以在它们上完成,您可以使用它们来创建您想要的输出;虽然我不完全确定我理解你的措辞。我所理解的,你想打开一个文件,用它的内容做一些事情,然后创建一个字符串,对吧?如果这是正确的,那么你很幸运,因为它很容易做到。

从文件传递到 python 的逗号分隔值非常容易解析为 python 友好的格式,例如列表、元组和字典。

正如您所说,您需要一个输入文件名、查找、读取文件并在不创建额外文件的情况下完成一些工作的功能。好的,要这样做,您的代码将如下所示:

def file_open(filename):
    new_dictionary = 
    f = open(/directory/filename, r) ##The second param is mode, here readable
    for line in f: ##iterating through each comma seperated value
        key,value = line.split(',') ##set the first entry before comma to key then val
        new_dictionary[key] = value ##set the new_dictionary key to value
    return new_dictionary ##spit that newly assembled dictionary back to us
    f.close() ##Now close the file.

如您所见,在此过程中没有创建其他文件。我们只是打开硬盘上的文件,做一些解析来创建我们的字典,然后返回字典以供使用。要为其输出的字典设置一些内容,只需为函数设置一个变量。只需确保从硬盘驱动器的根目录正确设置目录即可。

CSV_dictionary = file_open(my_file) ##This sets CSV with all the info.

我希望这对您有所帮助,如果我没有解决您的问题,请回答,我会尽力帮助您。

-约瑟夫

【讨论】:

-1 有两个原因:1)您实际上还没有回答OP的问题-他已经知道如何打开文件,但是他正在调用的第三方函数将不接受文件句柄(仅文件名。) 2)您的示例 CSV 处理代码将在字符串文字中间因逗号而中断 - "Jones, Julie" 将被读取为两个字段 "JonesJulie",这是错误的。相反,使用内置的csv 模块来解决这个问题(以及更多)。 哎呀李,我只是想帮忙。如果您知道解决方案,为什么不发布答案?返回两个字段的原因是,一个可以用作键,另一个用作值,并且都是函数私有的。我所做的并没有什么“错误”。随时发布有关如何使用 CSV 解决 OP 问题并证明我错了的具体答案,这比降低noobie 的声誉更有帮助。 我们都站在同一边。您热衷于贡献是件好事,但您确实实际上必须阅读 OP 的问题并解决他遇到的特定问题。就目前而言,您的回答将对另一个问题有所帮助,但对这个问题没有帮助。 技术问题:1) 需要引用open() 的模式参数,'r' 而不是r。 2) 在您发现的第一个逗号上将 CSV 行拆分为 key, value 对于每行恰好有两个字段的 CSV 文件是有意义的,但对于每行有很多字段的 CSV 文件来说意义不大。我的 CSV 文件通常看起来像 "Generator U22","Gas Turbine","PQ Mode",1.00,1.05,20,24,36。将其拆分为 8 个字段更有意义,这就是 csv 模块要做的事情。 3) 最后,请注意,您的 CSV 解析器假定没有重复键,根据您的数据,这可能是一个好主意,也可能不是一个好主意。

以上是关于python:传递字符串而不是文件作为函数参数的主要内容,如果未能解决你的问题,请参考以下文章

将列表对象作为函数参数传递(而不是默认值),是否有任何陷阱?

传递 const char 而不是 std::string 作为函数参数

作为参数的函数是不是必须按值传递? [复制]

如何在用户定义的函数中将数据库列作为参数传递?

python传递列表作为函数参数

没有指针,我可以在 Python 中将引用作为参数传递吗? [复制]