python基础案例 - 目录及文件操作

例8-1 利用 os 列出当前目录的绝对路径,及其下的所有子目录、所有文件。

import os
os.path.abspath('.')            # 当前IDEL所处的文件夹的绝对路径:'C:\\Program Files\\python3.9'
os.path.abspath('..')           # 当前所处的文件夹上一级文件夹的绝对路径:'C:\\Program Files
os.listdir()                           # 列出当前目录下,所有的文件夹及文件,返回一个列表
os.listdir('d:\\')                   # 列出d:\\目录下,所有的文件夹及文件,返回一个列表
y=[f for f in os.listdir(r'.\\')  if f.endswith(('.py','.txt'))]            # r 表示后面的字符不转义
print(y)                               # 将当前目录下后缀为py、txt的所有文件增加到列表中,并输出

例8-2  利用os.path创建目录、创建多级目录,判断目录、文件是否存在。

import os
os.mkdir(r'C:\pythonFiles\pythonProject\expr2')         # 创建一个目录:C:\pythonFiles\pythonProject\expr2
os.makedirs(r'C:\pythonFiles\pythonProject\expr2\expr1\expr1')                       # 一次性创建多级目录:d:\\Python\\test
print(os.path.isdir(r'C:\pythonFiles\pythonProject\expr2\expr1\expr1'))
print(os.path.isfile(r'C:\pythonFiles\pythonProject\expr0\test_copy.txt'))
print(os.path.exists(r'C:\pythonFiles\pythonProject\expr0\test_copy.txt'))
print(os.path.exists(r'C:\pythonFiles\pythonProject\expr0'))
os.path.join(r'C:\pythonFiles\pythonProject\expr0\test_copy.txt','test_copy.txt')        # 将路径和文件链接:'d:\\python\\test\\test.txt' 

 例8-3  利用shutil复制、移动目录及文件。

import os
import shutil
shutil.copyfile("test.txt",r"C:\pythonFiles\pythonProject\expr0\test_copy.txt")    # 拷贝当前工作目录下的test.txt至C:\pythonFiles\pythonProject\expr0
shutil.move("test.txt",r"C:\pythonFiles\pythonProject\expr0\test_copy.txt")        # 将当前工作目录下的test.txt文件移至C:\pythonFiles\pythonProject\expr0test_copy.txt
os.remove(r"C:\pythonFiles\pythonProject\expr0\test_copy.txt")                               # 删除指定的文件
shutil.copytree(r"C:\pythonFiles\pythonProject\expr0",r"C:\pythonFiles\pythonProject\expr11") # 将d:\\Python\\test下的目录、文件,复制到新路径下

# 文件对象处理

f = open('test.txt', 'a+')              # 追加读写模式,在原文件内容最后追加,无原文件新建
print(f.tell())                                     # 打印光标位置,按字符计数
f.seek(0)                                            # 把光标回到开头
print(f.readline())                            # 按行读 :一次默认读取 1 行
print(f.read(10))                              # 按字符读:一次读取 10 个字符
f.seek(12)                                          # 把光标移动到12个字符的位置
print(f.encoding)                             # 打印文件编码
f.flush()                      # 当往文件写内容的时候,会有一个缓存,达到一个时间,一次往文件写入。
                                   # 如果这时候断电可能内容并没有写入成功,flush刷新会立即执行
f.close()

test.txt内容:

123456
123456
123456123456
123456

运行结果

 例8-4:向文本文件中写入内容,然后再读出。

s1 = '我在学Python.\n文本文件的读写\n'            # 转义字符\n表示换行
s2 = ['人生苦短','我学Python.']                             # 所有元素,作为一行,添加
s3 = ['人生苦短\n','我学Python\n']                       # 元素后面有换行符,可作为多行,添加
with open('test.txt', 'w') as fp:                         # w 模式会清空文件原有内容
    fp.write(s1)                                                          # write(s1):将字符串s1 一次性写入
    fp.writelines(s2)                                                   # writelines (s2):将列表s2元素迭代写入
    fp.writelines(s3)
with open('test.txt') as fp:                                 # 默认按 r 模式打开文件
    print(fp.read())                                                   # 一次性读取所有内容,返回一个字符串

 例8-5:如果想保留原文件内容,只是在文件末尾添加,可用a模式打开文件。此时,若文件不存在,也会自动创建它。

s = '我在学Python.\n文本文件的读取\n'          # 转义字符\n表示换行
with open('test.txt', 'a+') as fp:                    # a+ 模式会保留原内容,并在文件末尾添加内容
    fp.write(s)
with open('test.txt') as fp:
    r = fp.readlines()                                             # readlines()不传参数,默认读取所有行,r为列表
    print(type(r))

 

 例8-6:readline()或readlines()遍历并输出文本文件的内容。

j = 0                                                                                              # j用于计数
with open(r'..\红楼梦.txt', encoding='utf8') as fp:       # 打开文本文件,with语句块内自动关闭
    while j < 10:
        line = fp.readline()                                                  # 每次读取一行,返回的字符串为该行内容
        print("(" + str(j) + ")",line)
        j += 1

例8-7:编写程序,将d盘根目录下所有文本文件中,含有字符串“密码”的所有文件名,写入到一个文件中。

import os
y = [f for f in os.listdir('C:\\pythonFiles\\pythonProject') if f.endswith('.txt')]     # 列表推导式:d盘根目录下所有“.txt”的文本文件
x = []                                                                                  # 定义空列表,将查找成功的文件名,添加进去
for f in y:                               # ------------ 对所有文本文件名进行迭代 ---------------------------------------------------                                  
    with open('C:\\pythonFiles\\pythonProject\\'+ f, encoding='utf8') as fp:        # 用with语句块处理打开的文件
        for line in fp:                                                            # 对打开的文件,逐行读取 
            if '密码' in line:                                                    # 若字符串'密码'在该行里  
                x.append(f)                                                       # 将文件名添加到列表中
                break                                                                 # 跳出本轮循环,开始下一轮循环
f = open('C:\\pythonFiles\\pythonProject\\密码存储文件名.txt', 'a+' ,encoding='utf8')    # 追加模式打开,若文件不存在,创建之
f.writelines(x)
f.close()

 需要注意的是,读取txt的时候encoding要相同,如果不同则需要进行额外处理,否则抛出异常。

 例8-8:将MySQL 8.0数据库文件 smstock.ibd写入到新文件smstock_new.ibd中。注意要用二进制形式读取,这是序列化过程,文件想要进行传输都要进行序列化,这里开文件流用的是二进制流。

with open(r'C:\pythonFiles\pythonProject\教材各章数据\教材各章数据\第8章数据\smstock.ibd','rb') as f:                 # 以二进制格式、采用只读模式打开文件
    s = f.readline()
    print(s)                                                               # 返回字节串(btyes): b'\x01\x0f\x00\...'
with open('smstock_new.ibd','wb+') as fp:
    fp.write(s)
    print('MySQL 数据库文件,读写成功!')

例8-9  将图片文件“格利高里·派克.jpg”写入到新文件“格利高里_new.jpg”中。

with open(r'C:\pythonFiles\pythonProject\教材各章数据\教材各章数据\第8章数据\格利高里·派克.jpg','rb') as fp:
    data = fp.read()
    print(type(data))                                                              #  <class 'bytes'>
    print(data)                                                                        #  Squeezed text (2041 lines)
with open('格利高里_new.jpg','wb+') as fp:
    fp.write(data)
    print("图片文件,读写成功!")

  例8-10   使用pickle的dump()方法序列化数据,并写入dat二进制文件中。

import pickle
x = [1, 2, 3]
y = ('a','b','c')
z = {4, 5, 6}
d = {'学号':'01', '姓名':'张三', 'age':18}
data = (100, 'Python', x, y, z, d)                            # 将各种数据变量,放在一个元组中
with open('test_pickle.dat', 'wb') as f:
    try:                                                  # ----------------------  处理意外 -------------------------
        for d in data:                                                  # 对data中的元素进行迭代
            pickle.dump(d, f)                                       # 对每一个元素,进行序列化并写入文件对象
        print('写dat文件成功。')                             # 迭代完成后,保存文件,并自动关闭文件
    except:
        print('写dat文件失败。')

 例8-11  使用pickle的load()方法反序列化数据,并输出dat二进制文件内容。

import pickle
with open('test_pickle.dat', 'rb') as f:
    end = False                                              # 定义一个逻辑变量,判断文件是否到了结尾
    while not end:                                         # 一次dump()方法,对应一次load()方法
        try:
            x = pickle.load(f)                            # 读取并反序列化每个数据
            print(x)                                           # 输出的内容,与原序列化前的内容一致
        except:
            end = True

例8-15 读取“年度新生人口和死亡人口.xls”的内容。该文件收录了1949-2016年期间,我国部分地区新生人口、死亡人口、净增人口数据。

 例8-16:用 openpyxl 库创建 xlsx 文件,并写入数据。

import openpyxl
wb = openpyxl.Workbook()                    # 创建Workbook,并默认会创建一个空表,名称为:Sheet
ws1 = wb.active                                                     # 获取默认的sheet,并激活
ws1.title = 'Sheet1'                                                # 设置Sheet名称
ws1['A1'] = '姓名'                                                 # 给单个单元格一个列名
ws1['B1'] = '年龄'
ws1.append(['张三', 18])                                       # 写入多个单元格(从有数据的行的下一行写入)
ws1.append(['李四', 19])
ws2 = wb.create_sheet('Sheet2')                          # 创建一个新sheet,可以指定名称
ws3 = wb.copy_worksheet(wb['Sheet1'])            # 复制Sheet1,新sheet名称为Sheet1 Copy
print(wb.sheetnames)                                            # 打印所有表名
wb.save('test.xlsx')                                           # 保存

注意方法openpyxl.Workbook()的Workbook首字母大写。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值