博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Python之旅】第二篇(一):Python文件处理
阅读量:6566 次
发布时间:2019-06-24

本文共 5580 字,大约阅读时间需要 18 分钟。

说明:

    主要是file()和open()函数的使用,但在查open()函数的帮助时,会有下面的说明:

1
2
3
>>> help(open)
……
Open a file using the file() type, returns a file object.

    因此,两个函数其实都是一样的,下面只用file()。

    在列举file()的作用时,使用help即是很好的方法,下面则是应重点关注的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
close(...)
 
|      close() -> None or (perhaps) an integer.  Close the file.
flush(...)
 
|      flush() -> None.  Flush the 
internal 
I/O buffer.
readline(...)
 
|      readline([size]) -> next line from the file, 
as 
a string. 
readlines(...)
 
|      readlines([size]) -> list of strings, 
each 
a line from the file.
seek(...)
 
|      seek(offset[, whence]) -> None.  Move to 
new 
file position.
tell(...)
 
|      tell() -> current file position, an integer (may be a long integer).
write(...)
 
|      write(str) -> None.  Write string str to file.
writelines(...)
 
|      writelines(sequence_of_strings) -> None.  Write the strings to the file.
xreadlines(...)
 
|      xreadlines() -> returns self.


1.创建文件

--基本格式:

1
2
3
f = file(
'test.txt'
'w'
)
f = write(
'Hello World!'
)
f.close()

·w:写模式,文件不存在就创建,存在则自动覆盖原来的内容,只能写,不能读;

·w+:写读模式,但一开始还是会清空原来文件内容,只是在写文件之后可以读取;

·写的内容放在内存当中,如果要写入磁盘,可以f.close()关闭文件或f.flush()实时写入磁盘;

·不可以实时改变模式,只能把文件关闭后,再次打开时定义模式;

--实例:

1
2
3
4
5
>>> f = file(
'test.txt'
'w'
)
>>> f.write(
'Hello World!'
)
>>> f.flush()
xpleaf@xpleaf-machine:~/seminar6/day2$ more test.txt
Hello World!

--write()与writelines()

·前者写入的内容只能是字符串,后者则可以写入列表:

1
2
3
4
5
6
>>> f.write([
'a'
'b'
'c'
])
Traceback (most recent call last):
  
File 
"<stdin>"
, line 
1
in 
<module>
TypeError: expected a character buffer object
>>> f.writelines([
'a'
'b'
'c'
])
>>>

--f.close()的重要说明

·如果没有f.close(),则在程序运行结束后,系统会自动帮我们关闭文件;

·长时间运行的程序,需要打开并编辑文件(如用'a'模式),没有关闭文件,会导致文件内容无法保持一致性的问题(如果系统中有其他程序需要编辑该文件);

·Linux中的Vim编辑器自带文件锁定功能,即不能同时编辑同一文件;

·Python中文件的锁是没有加上的,需要开发者自行为文件加锁。


2.读取文件与遍历文件内容

--基本格式:

1
2
3
f = file(
'test.txt'
'r'
) ===>可以不加
'r'
,默认就是该模式
f = read()
f.close()

·r:默认;

·r+:读写模式,可以尝试使用,每读取一行,指针就跳到下一行,写的时候,就直接覆盖掉指针指的这一行;

·rb:在windows平台下编辑的文件,在linux中用python进行读取时,模式要选择“rb”,否则有可能会出现乱码的现象,即跨平台的文件都要注意此点;

--read()、readline、readlines()与xreadlines()

·前三者都是直接把文件内容全部写入内存当中,然后再全部读取或一行一行地读取;

·都采用迭代的方式读取,即指针最开始指向第一行,读取第一行后,指针指向下一行;


-read()

·把文件内容全部读取:

1
2
3
4
5
>>> f = file(
'test.txt'
'r'
)
>>> f.read()
"Hello World!\nI'm xpleaf.\nNice to meet you!\n"
>>> f.read()
''            
===>内容已经读完,即指针已经在最后一行,后面没有内容

·可以用tell()查看当前指针的位置:

1
2
>>> f.tell()
43            
===>
43
,即是最后一个字符

·重新读取文件内容,可以f.close()后再次打开,也可以使用f.seek(0):

1
2
3
4
5
6
7
>>> f.seek(
0
)    ===>重新寻址,让指针指向文件最开始
>>> f.tell()
0
>>> print f.read()
Hello World!
I'm xpleaf.
Nice to meet you!

-readline()

·以字符串方式,一行一行地读取文件内容:

1
2
3
4
5
6
7
8
9
>>> f.seek(
0
)
>>> f.readline()
'Hello World!\n'
>>> f.readline()
"I'm xpleaf.\n"
>>> f.readline()
'Nice to meet you!\n'
>>> f.readline()
''

-readlines()

·以列表的方式,一行一行地读取文件内容,一行即为列表中的一个元素:

1
2
3
4
5
>>> f.seek(
0
)
>>> f.readlines()
[
'Hello World!\n'
"I'm xpleaf.\n"
, 'Nice to meet you!\n']
>>> f.readlines()
[]

·因此,习惯性的用法是:修改文件内容

1
2
3
4
5
6
7
>>> f.seek(
0
)
>>> filelist = f.readlines()
>>> print filelist
[
'Hello World!\n'
"I'm xpleaf.\n"
, 'Nice to meet you!\n']
>>> filelist[
2
] = 
'See you next time!'
>>> print filelist
[
'Hello World!\n'
"I'm xpleaf.\n"
, 'See you next time!']

·再以w的方式打开文件,用f.writelines(filelist)的方式写入,即可实现修改文件内容的目的;


-xreadlines()

·不是先把文件内容全部写入内存,而是每读取一行才写入一行,写下一行时即对前面内存中的内容进行回收;

·在读取较大文件时,适宜采用这种办法。


--文件内容的遍历:使用readlines()

1
2
3
4
5
6
7
8
>>> f = file(
'test.txt'
'r'
)
>>> filelist = f.readlines()
>>> 
for 
eachline 
in 
filelist:
...   print eachline,
... 
Hello World!
I'm xpleaf.
Nice to meet you!


3.文件内容追加

--基本格式:

1
2
3
f = file(
'test.txt'
'a'
)
f = write(
'Hello World!'
)
f.close()

·文件内容追加到最后一行上,如果最后一行有'\n',则追加到下一行;

·write只能添加字符串,如果是数值或其它类型的数据类型,则需要使用str()进行转换;

--实例:

1
2
3
4
5
6
7
8
9
>>> f = file(
'test.txt'
'a'
)
>>> f.write(
'See you next time!'
)
>>> f.write(
'I will miss you much!\n'
)
>>> f.flush()
xpleaf@xpleaf-machine:~/seminar6/day2$ cat test.txt
Hello World!
I'm xpleaf.
Nice to meet you!
See you next time!I will miss you much!


4.文件内容替换

--基本格式:

1
2
3
4
import 
fileinput
for 
line 
in 
fileinput.input(
'filepath'
, inplace = 
1
):
  
line = line.replace(
'oldtext'
'newtext'
)
  
print line,

·inplace = 1,表示要修改文件内的内容,默认值为0,表示不修改文件内容,加“print line,”时只打印内存中修改的内容(看下面例子);

·inplace = 1时,如果不加“print line,”,原来文件内容会为空;

·可以额外加backup参数,表示在修改文件内容时进行备份;


--实例:


-正确操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> 
import 
fileinput
>>> 
for 
line 
in 
fileinput.input(
'test.txt'
, inplace = 
1
, backup = 
'.ori'
):
...   line = line.replace(
'Hello World!'
'Hello, everyone!'
)
...   print line,
... 
xpleaf@xpleaf-machine:~/seminar6/day2$ ls -l test*
-rw-rw-r-- 
1 
xpleaf xpleaf 
87  
9
月  
4 
15
:
32 
test.txt
-rw-rw-r-- 
1 
xpleaf xpleaf 
83  
9
月  
4 
15
:
19 
test.txt.ori
xpleaf@xpleaf-machine:~/seminar6/day2$ cat test.txt
Hello, everyone!
I'm xpleaf.
Nice to meet you!
See you next time!I will miss you much!


-如果没有加inplace = 1时:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> 
for 
line 
in 
fileinput.input(
'test.txt'
):
...   line = line.replace(
'Nice'
'Well'
)
...   print line,
... 
Hello, everyone!
I'm xpleaf.
Well to meet you!
See you next time!I will miss you much!
xpleaf@xpleaf-machine:~/seminar6/day2$ cat test.txt
Hello, everyone!
I'm xpleaf.
Nice to meet you!
See you next time!I will miss you much!


-如果没有加“print line,”时:

1
2
3
4
5
6
7
8
>>> 
for 
line 
in 
fileinput.input(
'test.txt'
):
...   line = line.replace(
'Nice'
'Well'
)
... 
>>> 
for 
line 
in 
fileinput.input(
'test.txt'
, inplace = 
1
):
...   line = line.replace(
'Hello'
'Hey'
)
... 
xpleaf@xpleaf-machine:~/seminar6/day2$ cat test.txt
xpleaf@xpleaf-machine:~/seminar6/day2$     ===>文件内容已被清空
本文转自 xpleaf 51CTO博客,原文链接:http://blog.51cto.com/xpleaf/1691329,如需转载请自行联系原作者
你可能感兴趣的文章
法总统:英国若“无协议脱欧” 将成最大输家
查看>>
阿里巴巴宣布开源限流降级中间件——Sentinel
查看>>
以OpenGL/ES视角介绍gfx-hal(Vulkan) Framebuffer接口使用
查看>>
我为什么选择使用容器?
查看>>
如何提高 Xcode 的编译速度
查看>>
杂篇-从整理文件发起的杂谈[-File-]
查看>>
【临实战】使用 Python 处理 Nginx 日志
查看>>
Python中最好用的命令行参数解析工具
查看>>
LeetCode14.最长公共前缀 JavaScript
查看>>
"Hotpatch"潜在的安全风险
查看>>
下载文件的15种方法
查看>>
CSS
查看>>
Netty源码解析1-Buffer
查看>>
动态网站的爬取
查看>>
小知识一、让Swift继续用OC#warning效果
查看>>
源码阅读:AFNetworking(八)——AFAutoPurgingImageCache
查看>>
数据库的基础知识
查看>>
vue全家桶 ---axios的使用和二次封装
查看>>
Idea 插件开发常用的方法
查看>>
闭包--其实很简单
查看>>