python---文件的操作

1. 文件读取的三部曲: 打开–> 操作 -> 关闭

打开

f = open('/etc/passwd1')
print(f)

操作

content = f.read()
print(content)

写操作

f.write("hello")

判断文件对象拥有的权限

print(f.readable())  # True
print(f.writable())  # False

关闭

f.close()

2.文件读取模式的选择

r:

只能读, 不能写;
 读取的文件不存在, 是否会报错;
FileNotFoundError: [Errno 2] No such file or directory: '/etc/passwd1'
f = open('/tmp/passwd',mode='r')
print(f.read())

这里写图片描述

r+:

      可以执行读写操作;
      文件不存在, 报错;
      默认情况下, 从文件指针所在位置开始写入;
      写入的返回值是写入内容的长度
f = open('/tmp/passwd',mode='r+')
print(f.read())
print(f.write('456'))
print(f.read())

这里写图片描述

w:

 只能写入,不能读取文件
 文件不存在, 不报错并且会建立文件
 文件存在,先清空内容,再操作
f = open('/tmp/passwd1',mode='w')
print(f.write('123'))
f.close()

这里写图片描述

w+:

 可读可写
 文件不存在, 不报错并且会建立文件
 会清空文件内容
f = open('/tmp/passwd2',mode='w+')
print(f.write('456'))
print(f.read())
f.close()

a:

 只能写,不能读
 文件不存在, 不报错
 不会清空文件内容
f = open('/tmp/passwd2',mode='a')
print(f.write('456'))
print(f.read())
f.close()

没有读的权限

a+:

 可读可写
 文件不存在, 不报错
 不会清空文件内容
f = open('/tmp/passwd2',mode='a+')
print(f.write('456'))
print(f.read())
f.close()

此时没有报错

如果读取图片,音乐或者视频(非文本文件),需要通过二进制的方式进行读取与写入;只需要在以上模式后面加上b

#先读取二进制文件内容,保存在变量content里面
f1 = open('tupian.png',mode='rb')
content=f1.read()
f1.close()
print(content)

f2 = open('hello.png',mode='wb')
f2.write(content)
f2.close()

这里写图片描述

3.文件的常用属性

1.buffer缓冲区对象

f = open('/tmp/passwd',mode='r+')
print(f.buffer)

这里写图片描述

2.判断文件对象是否关闭,已经关闭返回Ture

f = open('/tmp/passwd',mode='r+')
print(f.closed)

这里写图片描述

3.文件号

f = open('/tmp/passwd',mode='r+')
print(f.fileno())

这里写图片描述

4.文件对象

f = open('/tmp/passwd',mode='r+')
print(f.name)

这里写图片描述

5.查看文件对象的相关信息

f = open('/tmp/passwd',mode='r+')
print(f)

这里写图片描述

4.文件常用方法

1.read() 默认情况读取文件的所有内容, 小的文件, 直接用read读取即可,
如果是一个大文件时(文件大小>内存大小), 不能通过read一次性读取所有内容;

f = open('/tmp/passwd',mode='r+')
print(f.read()) 

这里写图片描述

2.readline() 每次读取一行内容

f = open('/tmp/passwd',mode='r+')
print(f.readline())

这里写图片描述

3.readlins() 读取文件的所有内容, 返回一个列表, 列表元素分别为文件行内容

f = open('/tmp/passwd',mode='r+')
print(f.readlines())

这里写图片描述
这里写图片描述
4.readable() 判断文件是否有可读性

f = open('/tmp/passwd',mode='r+')
print(f.readable())

这里写图片描述
5.read(n) n为一个数字类似于head -c 3 /tmp/passwd命令, 自己写一个和阿的命令

f = open('/tmp/passwd',mode='r+')
print(f.read(5)) 

这里写图片描述

6.write() 从指针所在位置写入, 写入是字符串内容

f = open('/tmp/passwd',mode='r+')
print(f.write('abc'))

这里写图片描述

7.f.writelines() 将列表里面的每个元素写入文件中

f = open('/tmp/passwd',mode='w+')
print(f.read())
li = ['user'+str(i)+'\n' for i in range(10)]
print(f.writelines(li))

5.指针位置的操作

1.告诉指针当前位置

print(f.tell())
print('1:', f.read(3))
print("移动指针之前:", f.tell())

这里写图片描述

2.将文件指针移动到文件最开始

f = open('/tmp/passwd',mode='w+')
print(f.seek(0, 0))

这里写图片描述
3.将指针移动到文件最后

f = open('/tmp/passwd',mode='w+')
f.seek(0,2)
print("移动指针之后:", f.tell())
f.write("ptest")
f.close()

这里写图片描述

6.文件安全读取之with语句

with open('/tmp/passwd') as f:
    print("with语句里面:", f.closed)
    print(f.read())
print("after with语句:", f.closed)

这里写图片描述

# 同时打开两个文件对象(这种写法, python2中不支持)
with    open('/tmp/passwd') as f1, \
        open('/tmp/passwdBack', 'w+') as f2:
    # 将第一个文件的内容写入第二个文件中;
    f2.write(f1.read())
    # 移动指针移动到文件最开始
    f2.seek(0,0)
    # 读取指针内容
    print(f2.read())
# python2中只能这么实现
# with open('/tmp/passwd') as f1:
#     content = f1.read()
# with open('/tmp/passwdBack', 'w+'):
#     f2.write(content)

7.yield实现读取大文件

  1. 文件操作
    1). 创建文件data.txt, 文件共100000行, 每行存放一个1~100之间的整数.
    2). 找出文件中数字出现次数最多的10个数字, 写入文件mostNum.txt;
import random
with open('data.txt', mode='a+') as f:
     for i in range(1000000):
         f.write(str(random.randint(1,100))+'\n')


# 通过yield, 每次读取一行进行处理
def byLineReader(filename):
     with open(filename) as f:
         line = f.readline()
         # 如果可以读取到内容, 返回改行信息
         while line:
             yield  line
             line = f.readline()

# read是一个生成器对象,
read = byLineReader('data.txt')
print(read)
# # #1). next 读取生成器的内容
print(next(read))
print(next(read))

这里写图片描述

文件对象是可以for循环遍历的, 默认遍历的内容为每一行的内容.是节省内存空间的。

from collections import Iterable

f = open('data.txt')
print(isinstance(f, Iterable))
for i, item in enumerate(f):
    if i == 10:
        break
    print(i, item)

这里写图片描述

8.os之环境变量模块

import os

# 1). 返回操作系统类型, 值为posix,是Linux操作系统, 值为nt, 是windows操作系统
print(os.name)
print('Linux' if os.name=='posix' else 'Windows')

# 2). 操作系统的详细信息
info = os.uname()
print(info)
print(info.sysname)
print(info.nodename)

# 3). 系统环境变量
print(os.environ)

# 4). 通过key值获取环境变量对应的value值
print(os.environ.get('PATH'))
print(os.getenv('PATH'))

9.os之文件操作函数

import os
import random

from os.path import exists, splitext, join

print(os.path.isabs('/tmp/hello'))
print(os.path.isabs('hello'))

# 2. 生成绝对路径
print(os.path.abspath('/tmp/hello'))
print(os.path.abspath('hello.png'))

# 3. 'hello.png'
print(os.path.join('/home/kiosk', 'hello.png'))
# 返回一个绝对路径: 当前目录的绝对路径+ 文件名/目录名
print(os.path.join(os.path.abspath('.'), 'hello.png'))

# 4.获取目录名或者文件名
filename = '/home/kiosk/Desktop/201808python/day10/hello.png'
print(os.path.basename(filename))
print(os.path.dirname(filename))


# 5. 创建目录/删除目录
mkdir -p qq/qq1/qq1   递归创建目录
os.makedirs('img/films')
os.mkdir('img')
os.rmdir('img')

# 6. 创建文件/删除文件
os.mknod('00_ok.txt')
os.remove('00_ok.txt')

# 7. 文件重命名(mv)
os.rename('data.txt', 'data1.txt')

# 8. 判断文件或者目录是否存在
print(os.path.exists('img'))

# 9. 分离后缀名和文件名
print(os.path.splitext('hello.png'))
print(os.path.split('hello.png'))

# 10. 将目录名和文件名分离
print(os.path.split('/tmp/hello/hello.png'))

练习:
1. 在当前目录新建目录img, 里面包含100个文件, 100个文件名各不相同(X4G5.png)
2. 将当前img目录所有以.png结尾的后缀名改为.jpg.


 import string

 def gen_code(len=4):
     # 随机生成4位的验证码
     li = random.sample(string.ascii_letters+string.digits, len)
     # 将列表元素拼接为字符串
     return  "".join(li)

 def create_files():
     # 随机生成100个验证码
     li = {gen_code() for i in range(100)}

     os.mkdir('img')
# # 随机生成四个数字
     for name in li:
         os.mknod('img/' + name  + '.png')

from collections import Iterable

import sys


def modify_suffix(dirname, old_suffix, new_suffix):
    """
    :param dirname: 操作的目录
    :param old_suffix: 原先的后缀名
    :param new_suffix: 新的后缀名
    :return:
    """
    # 1. 判断查找的目录是否存在, 如果不存在, 显示报错
    if exists(dirname):
        # 2. 找出所有以old_suffix(.png)结尾的
        # pngfiles = [ filename for filename in os.listdir(dirname)
        #             if filename.endswith(old_suffix)]
        pngfiles = filter(lambda  filename: filename.endswith(old_suffix), os.listdir(dirname))
        # 3. 将文件名和后缀名分开, 留下所有的文件名
        basefiles = [splitext(filename)[0] for filename in pngfiles]
        print(basefiles)
        # 4. 文件重命名
        for filename in basefiles:
            # 需要加上目录名
            oldname = join(dirname, filename+old_suffix)
            newname = join(dirname, filename+new_suffix)
            os.rename(oldname, newname )
            print("%s重命名为%s成功" %(oldname, newname))
    else:
        print("%s不存在, 不能操作......" %(dirname))


# 如果该脚本没有被调用, 则执行下面的代码;
if __name__ == '__main__':
    # **** 如何在执行脚本时, 接收用户传入的参数;
    # 判断用户传的参数是否为3个参数?
    if len(sys.argv) == 4:
        dirname = sys.argv[1]
        old_suffix = sys.argv[2]
        new_suffix = sys.argv[3]
        # modify_suffix('img', '.png', '.jpg')
        modify_suffix(dirname, old_suffix, new_suffix)
    else:
        print("""
    Usage: %s dirname old_suffix new_suffix

        """ %(sys.argv[0]))

10.遍历指定目录下的所有内容

import os

from os.path import join

for root, dirs, files in os.walk('/var/log'):
    # print(root, dirs, files)
    for name in files:
        print(join(root, name))

猜你喜欢

转载自blog.csdn.net/suifengOc/article/details/82193583