Python之文件操作

一、文件管理

1、文件打开三部曲:

打开、操作、关闭

r: 只能读,不能写,
读取的文件不存在,会报错

r+:能读,能写,能追加,
文件不存在时报错

w: 只能写,不能读,
文件不存在新建文件,不报错
会清空覆盖文件内容,覆盖

w+:能读,能写,
会覆盖,
文件不存在时新建

a: 只能写,不能读
文件不存在新建文件,不报错
文件如果存在不会清空文件的内容,追加

a+:能读,能写,会追加,文件不存在时新建

#打开:
f = open('passwd''w')
#操作:
content = f.read()
f.write('westos')
#关闭文件:
f.close()


import random

f = open('data.txt', 'a+')
for i in range(10):
    content = f.read()
    num = random.randint(1, 100)
    f.write('%d\n' % num)

f.close()
2、练习
import random

f = open('data.txt', 'w')
for i in range(10):
    content = f.read()
    num = random.randint(1, 100)
    f.write('%d\n' % num)
    print content  #打印读的东西
f.close()
3、文件指针

文件指针标记从哪个位置开始读取数据,第一次打开文件时,通常文件指针会指向文件的开始位置,当执行了read方法后,文件指针会移动到读取内容的末尾

file = open('passwd')
text = file.read()
print text
print type(text)
print len(text)
print '*******'
# 移动文件指针到文件开头
file.seek(0)
text = file.read()
print len(text)
file.close()
4、正确读取大文件
file = open('passwd')
# 为什么要设定为无限循环:
# 因为我们不知道循环的条件
# 我们不知道文件到底有多少行
while True:
    text = file.readline()
    # 判断是否读取到了内容
    # 如果文件指针到文件的最后一行,那么就读取不到内容了
    if not text:
        break
    # 每读取一行的末尾已经有一个‘\n’
    print text
file.close()
5、复制文件

打开一个已经有的文件,读取完整的内容,并写到另一个文件中去

# 源文件以只读的方式打开
file_read = open('passwd')
# 目标文件以只写的方式打开
file_write = open('passwd_copy','w')

# 从源文件中读取内容
text = file_read.read()
# 将读取到的内容写到目标文件
file_write.write(text)

# 关闭文件
file_read.close()
file_write.close()
6、读取二进制文件

rb wb ab
rb+ wb+ ab+

# 读取二进制文件的内容
f1 = open('good.jpg',mode='rb')
content = f1.read()
f1.close()

f2 = open('happy.png',mode='wb')
f2.write(content)
f2.close()
7、另一种方式打开文件
with open('passwd') as f:
    lines = f.readline()
    print lines
for line in lines:
    print line
8、练习
  1. 生成一个大文件ips.txt,要求1200行, 每行随机为172.25.254.0/24段的ip;
  2. 读取ips.txt文件统计这个文件中ip出现频率排前10的ip;
import random
def create_ips_file(filename):
    ips = ['172.25.254.' + str(i) for i in range(1, 255)]
    with open(filename, 'a+') as f:
        for count in range(1200):
            f.write(random.sample(ips, 1)[0] + '\n')

def sorted_by_ip(filename,count =10):
    ips_dict = dict()
    with open(filename) as f:
        for ip in f:
            if ip in ips_dict:
                ips_dict[ip] += 1
            else:
                ips_dict[ip] = 1
    sorted_ip = sorted(ips_dict.items(),
                       key=lambda x:x[1],reverse=True)[:count]
    return sorted_ip
print sorted_by_ip('ips.txt')


二、os模块对文件的操作

1、对目录和文件的操作
import os

# 1,返回操作系统的类型,值为posix,是linux操作系统
#值为nt,是windows系统
print os.name

# 2,返回操作系统的详细
print os.uname()

# 3, 系统的环境变量
print os.environ
print os.environ.get('PATH')

# 4, 判断是否是绝对路径(不会判断文件或者目录是否存在)
print os.path.isabs('/tmp/westos')
print os.path.isabs('hello')

# 5,生成绝对路径
print os.path.abspath('hello.png')
print os.path.join('/home/kiosk','hello.png')
print os.path.join(os.path.abspath('.'),'hello.png')

# 6,获取目录名或者文件名
filename = '/home/kiosk/PycharmProjects/python/day08/hello.png'
print os.path.basename(filename)  # 文件名
print os.path.dirname(filename)   # 目录名

# 7,创建目录/删除目录
#os.mkdir('img')
#os.makedirs('img/file')  # mkdir -p
#os.rmdir('img/file')
os.rmdir('img')

# 8, 创建文件/删除文加
os.mknod('westos.txt')
os.remove('westos.txt')

# 9,文件的重命名(mv)
os.rename('westos.txt','data.txt')

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

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

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

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


def gen_code(len=4):
    # 随机生成4位文件名
    li = random.sample(string.ascii_letters + string.digits, len)
    # 将列表元素拼接成字符串
    return ''.join(li)


def create_file():
    # 随机生成多个文件名
    li = {gen_code() for i in range(100)}

    os.mkdir('img')
    for name in li:
        os.mknod('img/' + name + '.png')


# create_file()

def modify_suffix(dirname, old_suffix, new_suffix):
    """
    :param dirname:  所要操作的目录
    :param old_suffix: 之前的文件后缀
    :param new_suffix: 新的文件后缀
    :return:
    """
    # 1.判断查找的目录是否存在,如果不存在,显示报错
    if os.path.exists(dirname):
        # 2.找出所有以old_suffix(.png)结尾的文件
        pngfiles = [filename for filename in os.listdir(dirname)
                    if filename.endswith(old_suffix)]
        # 3.将文件名和后缀名分开,留下文件名
        basefiles = [os.path.splitext(filename)[0] for filename in pngfiles]
        print basefiles

        # 4.文重命名
        for filename in basefiles:
            # 需要加上目录名
            oldname = os.path.join(dirname, filename + old_suffix)
            newname = os.path.join(dirname, filename + new_suffix)
            os.rename(oldname, newname)
            print '%s 重命名成%s成功' % (oldname, newname)
    else:
        print '%s 不存在不能操作....' % dirname

modify_suffix('img','.jpg','.png')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值