1.读写文件
1.写文件
#!/usr/bin/env python
# -*- coding:utf8 -*-
# @TIME: 2018/2/3 19:47
# @AUTHOR: Chawn
# FILE: fileOption.py
if __name__ == '__main__':
# 输入文件名
filename = input("plz input the name of file:")
# 以写的方式打开文件
f = open(filename,"w")
while 1:
context = input("plz input the context('EOF' for exit): ")
if context == 'EOF':
f.close()
exit(1)
else:
# 写入输入的内容
f.write(context)
C:\Users\chawn\PycharmProjects\test\venv\Scripts\python.exe C:/Users/chawn/PycharmProjects/test/Day0203/fileOption.py
plz input the name of file:1.log
plz input the context('EOF' for exit): adfasf
plz input the context('EOF' for exit): 14233fqawfF
plz input the context('EOF' for exit): 65415ASFfdAS
plz input the context('EOF' for exit): eof
plz input the context('EOF' for exit): EOF
Process finished with exit code 1
执行之后,包里会出现1.log,如果本身就有1.log,会重写1.log
adfasf14233fqawfF65415ASFfdASeof
但是这样和预想的不一样,没有空格,在写入文件后加一个写入空格:
else:
f.write(context)
f.write("\n")
再次执行:
C:\Users\chawn\PycharmProjects\test\venv\Scripts\python.exe C:/Users/chawn/PycharmProjects/test/Day0203/fileOption.py
plz input the name of file:1.log
plz input the context('EOF' for exit): dADFwaf
plz input the context('EOF' for exit): asf564f5da
plz input the context('EOF' for exit): 2322as
plz input the context('EOF' for exit): EOF
Process finished with exit code 1
dADFwaf
asf564f5da
2322as
2.读文件
#!/usr/bin/env python
# -*- coding:utf8 -*-
# @TIME: 2018/2/3 20:29
# @AUTHOR: Chawn
# FILE: fileRead.py
# open('1.log','r')里的'r'可以省略不写,不写默认只读
f = open('1.log','r')
print('*'*10 + 'start' + '*'*10)
print(f.read())
print('*'*10 + 'end' + '*'*10)
f.close()
C:\Users\chawn\PycharmProjects\test\venv\Scripts\python.exe C:/Users/chawn/PycharmProjects/test/Day0203/fileRead.py
**********start**********
dADFwaf
asf564f5da
2322as
**********end**********
Process finished with exit code 0
2.文件的常用操作
- 文件的常用方法:
- readline()一行一行的读
- readlines()将文件全部读取,输出list,内容是元素
- next()
- read()
- write()写入的是字符串
- writelines()参数是序列,比如列表,它会迭代帮你写入
- 文件属性
- f.name
- f.closed判断是否关闭
- f.encoding
- f.mode (a,r,w)追加,写入,读
open文件最好写成这样的形式:
f = open('1.log','r',encoding="utf-8")
举例:
#!/usr/bin/env python
# -*- coding:utf8 -*-
# @TIME: 2018/2/3 20:29
# @AUTHOR: Chawn
# FILE: fileRead.py
# open('1.log','r')里的'r'可以省略不写,不写默认只读
f = open('1.log','r',encoding="utf-8")
print('*'*10 )
print(f.name)
# print('*'*10 )
# print(f.readline())
print('*'*10 )
print(f.readlines())
print('*'*10)
f.close()
C:\Users\chawn\PycharmProjects\test\venv\Scripts\python.exe C:/Users/chawn/PycharmProjects/test/Day0203/fileRead.py
**********
1.log
**********
['dADFwaf\n', 'asf564f5da\n', '2322as\n']
**********
Process finished with exit code 0
把print(f.readlines())换成print(f.readline())
#!/usr/bin/env python
# -*- coding:utf8 -*-
# @TIME: 2018/2/3 20:29
# @AUTHOR: Chawn
# FILE: fileRead.py
# open('1.log','r')里的'r'可以省略不写,不写默认只读
f = open('1.log','r',encoding="utf-8")
print('*'*10 )
print(f.name)
print('*'*10 )
print(f.readline())
# print('*'*10 )
# print(f.readlines())
print('*'*10)
f.close()
C:\Users\chawn\PycharmProjects\test\venv\Scripts\python.exe C:/Users/chawn/PycharmProjects/test/Day0203/fileRead.py
**********
1.log
**********
dADFwaf
**********
Process finished with exit code 0
可以看出,f.readline()是一行一行读,f.readlines()全部读取
- 另外,因为通常容易忘记关闭文件f.close(),可以with形式:
with open('1.log','r',encoding="utf-8") as f:
- 为了避免乱码,通常会导入codecs,所以上面的语句还可以改进:
with codecs.open('1.log','r',encoding="utf-8") as f:
3. 对passwd排序
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
给上面的文件按uid大小排序,效果如下:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
思路:
- 取出第三个元素,排序构成一个序列
- 此时的序列是由小到大排列的,匹配文件中每行第三个数字,如果相同,就写入一个新的文件,这个新的文件就是所要的
#!/usr/bin/env python
# -*- coding:utf8 -*-
# @TIME: 2018/2/6 10:30
# @AUTHOR: Chawn
# FILE: test.py
import codecs
file = "passwd"
sortfile = "sortpasswd.txt"
filecontext = []
sortuid = []
# 'wb' 以byte模式写入
with codecs.open(sortfile,'wb') as fsort:
with codecs.open(file,encoding="utf-8") as f:
# 把文件内容的每行写进list
filecontext = f.readlines()
for line in filecontext:
# 取出第三个字符串,转化为整型,追加到list
sortuid.append(int(line.split(":")[2]))
# 列表排序
sortuid.sort()
for uid in sortuid:
for line in filecontext:
# 如果列表sortuid的字符串和line里的第三个字符串相同
if str(uid) == line.split(":")[2]:
# 写入这一行到fsort
# 写的时候转换编码utf-8
fsort.write(line.encode("utf-8"))
执行结果: