读写文件--passwd排序

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"))

执行结果:

转载于:https://my.oschina.net/u/3746745/blog/1618092

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值