【语法糖】python文件

Horace_01 2022-08-06 05:19:20 阅读数:660

PythonCSDN文件语法technology-development

文件

1.从文件中读取数据

1.1读取整个文件

我们先创建一个txt格式的文件,将其命名为pi_digits

里面写入

3.1415926535
8979323846
2643383279

然后编写这样一个程序(命名为file_reader):

with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)

注意:程序和文件都要放在同一目录下(如果后续程序没有特殊声明,均默认为这种状态)

我们来解析这段代码

函数open()作用为打开一个文件,接受的参数为打开文件的名称(包括格式)

ps:这里用的是相对路径,而不是绝对路径。现在可以暂时不用管这个

执行open这个函数时,python会在file_reader所在文件夹的目录中寻找pi_digits.txt这个文件(如果找不到那就打不开)

open函数的返回值为一个表示文件的对象,这里open函数返回的对象存入file_object这个变量

由于file_object是对象,因此可以调用其中的方法(也叫函数),这里调用了read()函数读取整个文件的内容,将其作为一个长长的字符串储存进变量contents中

最后print(contents)打印出内容

3.1415926535
8979323846
2643383279

一气呵成!

1.2文件路径

当你掌握上面那种方法后,很自然的发现它的局限性,只能在代码文件目录下。

或是同目录下的另一个文件夹寻找

以下面图为例
在这里插入图片描述

如果titanic_kaggle文件夹中有一个文件a.txt,我要打开它,我当前运行的程序是file_reader.py,与该文件夹同目录

那么我就可以这样访问它:

with open('titanic_kaggle\a.txt') as file_object

如果是Linux和 OS X系统下则要将\改成/

回归正题

那如果我要打开的文件放在上一级的文件夹里,那就行不通了。

此处先要引入相对路径绝对路径的概念

假如说有两个人,一个叫A,一个叫B,他们形影不离,走到哪都不分开。如果我要找B,那我找到A就能找到B,具体的方法就是A—>B。这样找的途径就叫做相对路径

而B的家在x小区x栋x楼303,那么我就可以通过这个确切的地址找到B。这样找的途径叫做绝对路径

所以破除那个局限性的方法就是用文件的绝对路径表示文件。

类似于下面这样:

file_path = 'F:\typora_workspace\yoyoyo.txt'
with open(file_path) as file_object:

另外python会将\视为转义字符的标记,因此我们应在单引号前加r,让\在此失去转义标记的作用

1.3逐行读取

在实际情况中,我们可能需要读取每一行来寻找特定的信息

如果要以每次一行的方式检查文件,可对文件对象使用for循环进行操作

filename = 'pi_digits.txt'
with open(filename) as file_object:
for line in file_object:
print(line)

输出效果为:

3.1415926535
8979323846
2643383279

发现空行变多了!为什么呢?是因为每一行的末尾都有一个看不见的换行符,而且python里的print语句会自动加上一个换行符(跟C的puts一一个效果)

只要将print语句改成这样print(line.rstrip())即可恢复正常输出(遇到空格的时候不妨用rstrip()和strip())

另外line换成其他变量名字也是一样以行来读取的效果。(可以测试一下)

1.4创建一个包含文件各行内容的列表

使用readlines()函数,作用对象为文件对象。作用:从文件中读取每一行,并将其存储到一个列表

实例代码:

filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line)

输出效果:

3.1415926535
8979323846
2643383279

此处readlines将文件每行的内容存储到了一个列表,赋值给lines,所以lines是个列表

因此我们也可以访问列表中的元素(也就是文件的每一行)

可以print(lines[0]),输出效果为:

3.1415926535

也可以用切片输出print(lines[:2]),输出效果为:

['3.1415926535\n', ' 8979323846\n']

这也印证了1.3节所说的每行末尾有个看不见的换行符。

另外,切片[a:b],输出索引a到索引b处的元素(包含索引a,不包含索引b处),我写出来才知道,害,基础不牢

我们同样可以用in来检查pi中是否有某人的生日序列

filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
birth = input("Enter your birthday:")
if birth in lines:
print("wow,your birthday appears in pi!")
else:
print("What a pity!")
Enter your birthday:20010928
What a pity!

so sad,居然没有我的。

读取文件时,python将所有内容都是为字符串,如果读取的是数字,则会变成字符型数字,如果要进行数值运算,要先对它用int()将其变为整数形式

2.写入文件

2.1写入空文件

一段示例程序:

file_name = 'programming.txt'
with open(file_name,'w') as file_object:
file_object.write("I love programming.")

要将文本写入空文件时,在调用open()时需要提供两个参数,第一个实参是要打开的文件的名称,第二个实参是选定打开文件的模式。

这里是’w’,说明要以写入模式打开这个文件。

打开文件的模式总共有’r’(read,读取模式),‘w’(write,写入模式),‘a’(addtion,附加模式),‘r+’(能够读取和写入文件的模式)

如果省略了第二个实参(即模式),python将以默认的只读模式打开文件

程序调用file_object的write()函数进行写入

语法:文件对象.write(‘写入的内容’)

如果你要写入的文件不存在,函数open()将自动创建它。但如果原本存在着一个programming.txt文件,以写入模式往里面写入东西,python则会在with open(file_name,'w') as file_object返回文件对象前将其中的内容全部清空

运行成功后,我们可以看到程序目录下生成了一个programming.txt文件。打开它会发现里面的内容是I love programming.

我们其实还能生成markdown文件,只需把文件的后缀名格式txt改成md,因此我们可以通过修改后缀生成不同格式的文件

2.2写入多行

由于write()函数不会在你写入内容后添加换行符,所以如果要实现多行的效果,要自己手动在内容后添加一个**\n**

2.3附加到文件

如果我想给文件添加内容,而不是覆盖原有的内容,可以用附加模式,即’a’来打开文件。

file_name = 'programming.txt'
with open(file_name,'a') as file_object:
file_object.write("I also love finding meaning in large datasets.\n")
file_object.write("I love creating apps that can run in a browser.\n")

输出效果为:

成功地在文件后添加了内容

3.对多个文件进行操作

上面我们都是对单一文件进行读取写入,有没有办法对多个文件进行这样的操作呢?

有!将文件名存入一个列表中,利用for循环遍历列表元素(即每一个元素),将操作文件的内容也放在for中。

现在来看一个例子,snip是省略了具体内容的意思

def count_words(filename):
"""计算一个文件中包含多少个单词"""
--snip--
filenames = ['alice.txt','siddhartha.txt','moby_dick.txt','little_women.txt']
for filename in filenames:
count_words(filename)

这样即可对多个文件进行操作

版权声明:本文为[Horace_01]所创,转载请带上原文链接,感谢。 https://blog.csdn.net/m0_50123831/article/details/110136212