基本文件方法

#前面了解了打开文件的open函数,也做了一些简单的示例,接下来介绍一些基本文件方法,在开始介绍之前,首先了解一下流的概念。

#I/O编程中,Stream(流)是一个很重要的概念。可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动。Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。浏览网页时,浏览器和服务器之间至少需要建立两根水管,才能既发送数据又接受数据。

1、读和写

#open函数返回的是一个File对象,有了File对象,就可以开始读取内容。如果希望将整个文件的内容读取为一个字符串值,可以使用File对象的read()方法。

#Read()方法从一个打开的文件中读取字符串,需要注意,Python字符串可以是二进制数据,而不是仅仅是文字。语法如下:

1 fileObject.read([count])

#fileObject为open函数返回的File对象,count参数是从已打开的文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,就会尝试尽可能多地读取内容,很可能一直读取到文件末尾。

#比如我们在test.txt文件写入“Hello Python!wecome ”,执行如下代码:

1 #!/usr/bin/python3
2 #-*-coding:UTF-8-*-
3 #read
4
5 path=‘./test.txt‘
6
7 f_name=open(path,‘r‘)
8 print(‘read result‘,f_name.read(12))

#执行结果如下:

1 D:\Pythonworkspace>python read.py
2 read result: Hello Python

#由执行结果看到,通过read方法我们读取了文件中从头开始的12个字符串。

#将print(‘read result:‘f_name.read(12))更改为print(‘read result:‘f_name.read()),得到的执行结果如下:

1 D:\Pythonworkspace>python read.py
2 read result: Hello Python!Wecome!

#由执行结果看到,没有指定读取字节数时,read方法会读取打开文件中的所有字节。

#除了读取数据外,我们还可以像文件中写入数据。在Python中,将内容写入文件的方式与print函数将字符串输出到屏幕上类似。

如果打开文件时使用读模式,就不能写入文件,即不能用下面这种形式操作文件:

1 open(path,‘rw‘)

#在Python中,用write()方法向一个文件写入数据。write()方法可将任何字符串写入一个打开的文件。需要注意,Python字符串可以是二进制数据,而不仅仅是文字。

#write()方法不会在字符串结尾添加换行符(‘\n‘),语法如下:

1 fileObject.write(string)

#fileObject为open函数返回的File对象,string参数是需要写入文件中的内容。

#该方法返回写入文件的字符串的长度。

#例如:

1 #!/usr/bin/python3
2 #-*-coding:UTF-8-*-
3 #write
4
5 path=‘./test.txt‘
6 f_name=open(path,‘w‘)
7 print(‘write length:‘,f_name.write(‘Hello Python!‘))

#执行结果如下:

1 D:\Pythonworkspace>python write.py
2 write length: 13

#由执行结果看到,我们向test.txt文件中写入了13个字符。下面验证一下写入是否是我们指定的字符,在上面的程序中追加两行代码并执行:

 1 #!/usr/bin/python3
 2 #-*-coding:UTF-8-*-
 3 #read_write
 4
 5 path=‘./test.txt‘
 6 f_name=open(path,‘w‘)
 7 print(‘write length:‘,f_name.write(‘Hello Python!‘))
 8
 9 f_name=open(path,‘r‘)
10 print(‘read result:‘,f_name.read())

#执行结果如下:

1 D:\Pythonworkspace>python write.py
2 write length: 13
3 read result: Hello Python!

#由执行结果看到,写入文件的是我们指定的内容。不过这有一个疑问,我们这里执行了两次写入操作,得到的结果怎么只写入了一次?

#写文件(write)方法的处理方式:将覆写原有文件,从头开始,每次写入都会覆盖前所有内容,就像用一个新值覆盖一个变量的值。若需要在当前文件的字符串后追加字符,该如何操作?

#可以将第二个参数w更改为a,即以追加模式打开文件,例如:

 1 #!/usr/bin/python3
 2 #-*-coding:UTF-8-*-
 3 #write.a
 4
 5 path=‘./test.txt‘
 6
 7 f_name=open(path,‘w‘)
 8 print(‘write length:‘,f_name.write(‘Hello Python!‘))
 9
10 f_name=open(path,‘r‘)
11 print(‘read result:‘,f_name.read())
12
13 f_name=open(path,‘a‘)
14 print(‘write length:‘,f_name.write(‘Wecome!‘))
15
16 f_name=open(path,‘r‘)
17 print(‘read result:‘,f_name.read())

#执行结果如下:

1 D:\Pythonworkspace>python read.write.py
2 write length: 13
3 read result: Hello Python!
4 write length: 7
5 read result: Hello Python!Wecome!

#由执行结果看到,输出结果在文件末尾成功追加了对应的字符串。

#如果传递open函数的文件名不存在,写模式(w)和追加模式(a)就会创建一个新的空文件,然后执行写入或追加。

#如果想追加的字符串在下一行,该如何操作。

#在Python中,用\n表示换行。对于上面的示例,若需要追加的内容在下一行,可以如下操作:

 1 #!/usr/bin/python3
 2 #-*-coding:UTF-8-*-
 3 #\n
 4
 5 path=‘./test.txt‘
 6
 7 f_name=open(path,‘w‘)
 8 print(‘write length:‘,f_name.write(‘Hello Python!‘+‘\n‘))
 9
10 f_name=open(path,‘r‘)
11 print(‘read result:‘,f_name.read())
12
13 f_name=open(path,‘a‘)
14 print(‘add length:‘,f_name.write(‘Wecome!‘))
15
16 f_name=open(path,‘r‘)
17 print(‘read result:‘,f_name.read())

#执行结果如下:

1 D:\Pythonworkspace>python write_n.py
2 write length: 14
3 read result: Hello Python!
4
5 add length: 7
6 read result: Hello Python!
7 Wecome!

#由执行结果看到,追加的内容在下一行了。

#若需要读或写特定编码方式的文本,则需要给open函数传入encoding参数;若需要读取GBK编码的文件,则前面示例可以改写为f_name=open(path,‘r‘,encoding=‘gbk‘),这样读取到的文件就是GBK编码方式的文件了。

2、读写行

#我们目前对文件的读操作是按字节读或整个读取,而写操作是全部覆写或追加,这样的操作在实际应用中很不实用。Python为我们提供了readline()、readlines()和writelines()等方法用于行操作,例如:

 1 #!/usr/bin/python3
 2 #-*-coding:UTF-8-*-
 3 #readline
 4
 5 path=‘./test.txt‘
 6 f_name=open(path,‘w‘)
 7 f_name.write(‘Hello Python!\n‘)
 8 f_name=open(path,‘a‘)
 9 f_name.write(‘Wecome!‘)
10 f_name=open(path,‘r‘)
11 print(‘readline result:‘,f_name.readline())

#执行结果为:

1 D:\Pythonworkspace>python readline.py
2 readline result: Hello Python!

#由执行结果得知,readline方法会从文件中读取单独一行,换行符为\n。readline方法如果返回一个空字符串,说明已经读取到了最后一行了。

#readline方法也可以像read方法一样传入数值读取对应的字符数,传入小于0的数值表示整行都要输出。

#如果将上面示例的最后一行:

1 print(‘readline result:‘,f_name.readline())

#更改为:

1 print(‘readline result:‘,f_name.readlines())

#得到的输出结果为:

1 D:\Pythonworkspace>python readline.py
2 readline result: [‘Hello Python!\n‘, ‘Wecome!‘]

#输出结果为一个字符串的列表。列表中的每个字符串就是文本中的每一行,并且换行符也会被输出。

#readlines方法可以传入数值参数,当传入的数值小于等于列表中一个字符串的长度值时,该字符串会被读取;当传入小于等于0的数值时,所有字符都会被读取。

#例如:

 1 #!/usr/bin/python3
 2 #-*-coding:UTF-8-*-
 3 #readlines
 4
 5 path=‘./test.txt‘
 6
 7 f_name=open(path,‘w‘)
 8 str_list=[‘Hello Python!\n‘,‘Wecome!\n‘,‘Wecome!\n‘]
 9 print(‘write length:‘,f_name.writelines(str_list))
10 f_name=open(path,‘r‘)
11 print(‘read result:‘,f_name.read())
12 f_name=open(path,‘r‘)
13 print(‘read result:‘,f_name.readlines())

#执行结果如下:

1 D:\Pythonworkspace>python readlines.py
2 write length: None
3 read result: Hello Python!
4 Wecome!
5 Wecome!
6
7 read result: [‘Hello Python!\n‘, ‘Wecome!\n‘, ‘Wecome!\n‘]

#由执行结果看到,writelines方法和readlines方法相反,传给他一个字符串列表(任何序列或可迭代对象),他会把所有字符串写入文件。如果没有writeline方法,就可以使用write方法代替这个方法的功能。

3、关闭文件

#前面了解了很多读取和写入文件的内容,都没有提到在读或写的过程中出现异常时该如何处理。在读或写文件的过程中,出现异常的概论还是挺高的,特别是对于大文件的读取和写入,出现异常更是频繁。在读或写文件的过程中,出现异常该如何处理。

#这就需要用到前面学的异常的知识了,用try语句捕获可能出现的异常。在捕获异常前有一个动作要执行,就是使用close方法关闭文件。

#一般情况下,一个文件对象在退出程序后会自动关闭,但是为了安全起见,还是要显式地写一个close方法关闭文件。一般显示关闭文件读或写的操作如下:

1 #!/usr/bin/python3
2 #-*-coding:UTF-8-*-
3 #close
4
5 path=‘./test.txt‘
6
7 f_name=open(path,‘w‘)
8 print(‘write length:‘,f_name.write(‘Hello Python!‘))
9 f_name.close()

#这段代码和没有加close方法的执行结果一样。这样处理后的函数比没有加close时更安全,可以避免在某些操作系统或设置中进行无用的修改,也可以避免用完系统中所打开文件的配额。

#对内容更改过的文件一定要记得关闭,因为写入的数据可能被缓存,如果程序或系统因为某些原因而崩溃,被缓存部分数据就不会写入文件了。为了安全起见,在使用完文件后一定要记得关闭。

#当使用try语句出现异常时,即使使用了close方法,也可能不被执行,这时该怎么办?

#是否正常都会调用close方法。上面的示例可以更改成更安全的形式:

 1 #!/usr/bin/python3
 2 #-*-coding:UTF-8-*-
 3 #close2
 4
 5 path=‘./test.txt‘
 6 try:
 7     f_name=open(path,‘w‘)
 8     print(‘write length:‘,f_name.write(‘Hello Python!‘))
 9 finally:
10     if f_name:
11         f_name.close()

#如果每次都要这么写,就会很繁琐,是否有更简便的方式处理呢?

#Python中引入了with语句自动帮我们调用close方法。可以使用with语句将上面的程序更改为:

1 #!/usr/bin/python3
2 #-*-coding:UTF-8-*-
3 #close2
4
5 path=‘./test.txt‘
6 with open(path,‘w‘) as f:
7     f_name=open(path,‘w‘)
8     print(‘write length:‘,f_name.write(‘Hello Python!‘))

#这段代码和上面的使用try/finally的效果一样,并且会自动调用close方法,不用显式地写该方法。可以发现,代码比前面简洁多了,后面可以多用这种方式编写。

4、文件重命名

#在应用程序的过程中,我们可能需要程序帮助我们重命名某个文件的名字,而不是通过手动的方式进行,这样是否可行呢?

#Python的os模块为我们提供了rename方法,即文件重命名。使用这个方法需要导入os模块。 #rename方法的语法如下:

1 os.rename(current_file_name,new_file_name)

#os为导入的os模块,current_file_name为当前文件名,new_file_name为新文件名。若文件不在当前目录下,则文件名需要带上绝对路径。

#该方法没有返回值。

#使用示例如下:

1 #!/usr/bin/python3
2 #-*-coding:UTF-8-*-
3 #rename
4
5 import os
6
7 open(‘./test1.txt‘,‘w‘)
8 os.rename(‘test1.txt‘,‘test2.txt‘)

#执行结果可以到对应目录下查看,若之前已经创建了名为test1.txt的文件,则将文件名更改为test2.txt;若之前没有创建test1.txt文件,则先创建test1.txt文件,然后将文件更改为test2.txt。

5、删除文件

#在应用程序的过程中,我们是否可以通过程序删除某个文件呢?

#Python的os模块为我们提供了remove方法,即删除文件。使用这个方法需要导入os模块。remove方法的语法如下:

1 os.remove(file_name)

#os为导入的os模块,file_name为需要删除的文件名。若文件不在当前目录,则文件名需要使用绝对路径。

#该方法没有返回值。

#使用示例如下:

 1 #!/usr/bin/python3
 2 #-*-coding:UTF-8-*-
 3 #remove
 4
 5 import os
 6
 7 try:
 8     print(‘remove result:‘,os.remove(‘test2.txt‘))
 9 except Exception:
10     print(‘file not found‘)

#执行两次的结果如下:

1 D:\Python\workspace\datatime\20180116>python remove.py
2 remove result: None
3
4 D:\Python\workspace\datatime\20180116>python remove.py
5 file not found

#执行该文件会把前面的示例中重命名的test2.txt文件删除。当然,该方法只能删除已经存在的文件,文件不存在就会抛出异常。

原文地址:https://www.cnblogs.com/DLHe/p/8367502.html

时间: 2024-10-29 09:27:25

基本文件方法的相关文章

iOS 在object-c 中调用c文件 方法

1,新建c 头文件  lib.h 定义 c 函数 2,新建 c 实现文件,新建模板选中 c File  lib.c 3,oc 中调用,引用 c 头文件 lib.h ok .搞定 iOS 在object-c 中调用c文件 方法,布布扣,bubuko.com

iOS 网络请求 NSURLSession 的上传文件方法

NSURLSession/NSURLConnection的上传文件方法 此篇文章的理论基础主要是与HTTP网络通信协议相关.为集中精力,可以先把TCP/IP协议这些置之不理,也就是先只关注HTTP的请求和响应的结构.HTTP完整的原理内容就此略过.在此只略提相关内容.文中涉及的设计源码可以通过这里获取 https://github.com/wuqingjian2015/uploadHelper,有意者可以去看看. HTTP是干什么用的呢? 先考虑一下以下应用过程: 从客户端向服务器端发起一个请求

Java读写文件方法总结

Java的读写文件方法在工作中相信有很多的用处的,本人在之前包括现在都在使用Java的读写文件方法来处理数据方面的输入输出,确实很方便.奈何我的记性实在是叫人着急,很多时候既然都会想不起来怎么写了,不过我的Java代码量也实在是少的可怜,所以应该多多练习.这里做一个总结,集中在一起方面今后查看. Java读文件 1 package 天才白痴梦; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.F

读取文件方法大全

原文链接:[Java]读取文件方法大全 - lovebread - 博客园 http://www.cnblogs.com/lovebread/archive/2009/11/23/1609122.html 1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile {    /**     * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件.     */    public static voi

jquery动态加载js/css文件方法

先来看jquery自带的getSrcript文件 方法 代码如下 复制代码 $.getScript(url,callback) 实例 代码如下 复制代码 var testVar = 'New JS loaded!'; alert(testVar); function newFun(dynParam) { alert('You just passed '+dynParam+ ' as parameter.'); } 动态调用方法 HTML代码 代码如下 复制代码 <script type="

Java项目 使用MyEclipse打包生成jar文件方法

使用MyEclipse打包生成jar文件方法 1.  鼠标右键单击要打包的项目 2.  在打开的窗口中选择对应的项目,(java 普通程序对应java:web项目对应) 3. 4.默认设置 点击Next 5. 6. 7. 8.文件打包完成:

WinDbg分析DMP文件方法完全攻略

前言:在C++实际开发过程中,开发出来的程序,一般情况下由开发人员进行单元测试,然后移交给测试人员进行测试.在开发人员测试出现的bug,我们可以直接在本地进行调试.如果测试人员测试出崩溃级别的bug,如果我们需要调试往往借助于vs提供的Remote Debugger工具进行远程调试(关于vs2010远程调试的方法,请参考http://blog.sina.com.cn/s/blog_a459dcf5010153o7.html),然是当程序在用户手中出现崩溃此时我们可以采用Remote Debugg

OC管理文件方法

1.常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path //从一个文件读取数据 -(BOOL)createFileAtPath: path contents:(NSData *)data attributes:attr //向一个文件写入数据 -(BOOL)removeItemAtPath:path error:err //删除一个文件 -(BOOL)moveItemAtPath:from toPath:to error:err //重命名或者

py查询文件方法例子

mport os def findExtension(path,el): if(os.path.exists(path)): try: items=os.listdir(path) for item in items: if(os.path.isfile(os.path.join(path,item))): print (item,el) else: findExtension(os.path.join(path,item),el) except Exception,message: print

Asp.net读取和写入txt文件方法(实例)!

Asp.NET读取和写入txt文件方法(实例)! [程序第一行的引入命名空间文件 - 参考] System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; usi