当前位置: 首页 > 后端技术 > Python

翻译:《实用的Python编程》01_06_文件

时间:2023-03-26 17:12:50 Python

目录|上一节(1.5清单)|下一节(1.7函数)1.6文件管理大多数程序需要从某处读取输入。本节讨论文件访问。文件输入输出打开一个文件:f=open('foo.txt','rt')#Openforreading(text)g=open('bar.txt','wt')#Openforwriting(text)读取所有数据:data=f.read()#最多只读'maxbytes'bytesdata=f.read([maxbytes])写一些文本:g.write('sometext')完成后,关闭文件:f.close()g.close()应该正确关闭文件,这是一个容易忘记的步骤。因此,首选方法是使用这样的with语句:withopen(filename,'rt')asfile:#Usethefile`file`...#Noneedtocloseexplicitly...statementswhencontrolflowleavesindentation,这将自动关闭文件。读取文件数据的习惯用法是一次读取整个文件作为一个字符串:withopen('foo.txt','rt')asfile:data=file.read()#`data`是一个包含所有文本的字符串在`foo.txt`中通过迭代逐行读取文件:withopen(filename,'rt')asfile:forlineinfile:#Processthelineidiomforwritestringdata:withopen('outfile','wt')asout:out.write('HelloWorld\n')...redirectprint()函数:withopen('outfile','wt')asout:print('HelloWorld',file=out)...练习册练习依赖于Data/portfolio.csv文件。该文件由有关股票投资组合的逐行信息组成。假定您在practical-python/Work/目录中工作。如果您不确定自己所在的目录,可以通过执行以下操作找出Python在哪个目录中运行:>>>importos>>>os.getcwd()'/Users/beazley/Desktop/practical-python/Work'#Outputvary>>>Exercise1.26:FilePreview首先,尝试将整个文件作为字符串一次读取:>>>withopen('Data/portfolio.csv','rt')asf:data=F。read()>>>data'name,shares,price\n"AA",100,32.20\n"IBM",50,91.10\n"CAT",150,83.44\n"MSFT",200,51.23\n"GE",95,40.37\n"MSFT",50,65.10\n"IBM",100,70.44\n'>>>print(data)name,shares,price"AA",100,32.20"IBM",50,91.10"CAT",150,83.44"MSFT",200,51.23"GE",95,40.37"MSFT",50,65.10"IBM",100,70.44>>>在上面的例子中,应该请注意,Python有两种输出模式。在第一种模式中,您在提示符下键入数据,Python会向您显示包含引号和转义码的原始字符串。当您键入print(data)时,您将获得作为真实字符串的格式化输出。一次读取一个文件很容易,但它通常不是读取文件的最合适方式——尤其是当文件恰好很大或包含要一次处理所有文本行时。要逐行读取文件,请使用这样的for循环:>>>withopen('Data/portfolio.csv','rt')asf:forlineinf:print(line,end='')name,shares,price"AA",100,32.20"IBM",50,91.10...>>>当您使用上面显示的代码时,它将读取文件的每一行,直到到达文件末尾.在文件末尾,循环停止。在某些特定情况下,您可能希望手动阅读或跳过某行文本(例如,您可能希望跳过列标题的第一行):>>>f=open('Data/portfolio.csv','rt')>>>headers=next(f)>>>headers'name,shares,price\n'>>>forlineinf:print(line,end='')"AA",100,32.20"IBM",50,91.10...>>>f.close()>>>next()函数返回文件中的下一行文本。如果您重复调用该函数,您将获得连续的行。但是,如您所知,for循环已经使用next()函数来获取数据。因此,一般来说,除非您试图显式地跳过或读取如上所示的一行,否则不要直接调用next()函数。读取文件的行后,您可以开始执行更多操作,例如拆分。例如,试试这个:>>>f=open('Data/portfolio.csv','rt')>>>headers=next(f).split(',')>>>headers['name','shares','price\n']>>>forlineinf:row=line.split(',')print(row)['"AA"','100','32.20\n']['"IBM"','50','91.10\n']...>>>f.close()注意:在这些示例中,f.close()被显式调用,因为没有使用with语句传输。练习1.27:读取数据文件现在你知道了如何读取文件,让我们编写一个程序来执行简单的计算。portfolio.csv文件中的列对应于股票的名称、股票数量和个人股票持有量的购买价格。编写一个名为pcost.py的程序打开此文件,读取所有行并计算购买所有股票投资组合中的这些股票的成本。提示:要将字符串转换为整数,请使用int()函数。要将字符串转换为浮点数,请使用float()函数。你的程序应该打印以下输出:Totalcost44671.15练习1.28:其他类型的“文件”如果你想读取非文本文件(比如gzip数据文件)怎么办?虽然内置的open()函数在这里对您没有帮助,但Python提供的gzip模块可以读取gzip文件。试试这个:>>>importgzip>>>withgzip.open('Data/portfolio.csv.gz','rt')asf:forlineinf:print(line,end='')...查看输出...>>>注意:在此处包含“rt”文件模式至关重要。如果您忘记使用它,您将获得字节字符串而不是通常的文本字符串。说明:我们不应该为此使用Pandas吗?数据科学家很快指出,Pandas等库已经具有读取CSV文件的功能,那么为什么不使用Pandas?完全正确-而且效果也一样。然而,这不是学习Pandas的课程,读取文件是一个比读取CSV文件更普遍的问题。我们使用CSV文件作为示例的主要原因是它是大多数编码人员熟悉的格式,并且开箱即用相对容易-在读取CSV文件的过程中,许多Python功能是插图。所以,当你回去工作时,一定要使用Pandas。但是,在本课程的剩余部分,我们将继续使用标准Python函数。目录|上一节(1.5清单)|NextSection(1.7Functions)注:完整翻译见https://github.com/codists/practical-python-zh

猜你喜欢