9day 各文件的读取操作

五 文件的读取操作

5.1 文件读写模式

(1)数据持久化
将数据从瞬时状态转换为持久状态

(2)open(参数1.参数2,参数3…) - 打开文件,打开的是一个文件对象。
参数1:路径和文件名。
参数2:文件打开的方式(读、写)。
参数3:文件打开的编码形式:utf-8。

参数1:
语法: .表示当前文件夹(可以省略不写);…表示返回上一级。
文件夹和文件夹之间以及文件夹和文件之间需要使用\间隔。
路径有当前路径和绝对路径
相对路径:以当前所找参照物为基础,另一个文件相对于参照物的所在位置,应该使用/
以磁盘为参照物,使用\

假设目前我处于文件夹B中,如果要找到文件A: …\文件夹A\文件A

open(r'./test/文件1.txt')
open(r'C:\Users\yang1\Desktop\上课代码\7day\test\文件1.txt')

参数2:r、a、w、+等
r:只读,如果文件不存在,报错。
w:只写,文件不存在,先自动创建;如果文件存在,先清空(如果某个文件夹不存在,不会创建文件夹)。
a:只写,文件不存在,报错;文件存在,追加。
+:可读可写,将r、a、w变为可读可写的符号:r+、a+、w+;python操作文件要么读,要么写,不能同时读写。

参数3:encoding = ‘utf-8’

f = open(r'./test/文件1.txt','r',encoding = 'utf-8')
print(f)
read()从文件对象中读信息
result = f.read()
print(result)

所有文件在内存中是以二进制形式保持的。
参数2:
r、w、a、+ -->文件编辑方式
t、b -->文件展示形式
t:文本
b:字节
r、w、a等价于rt、wt、at -->默认,可以不写。
rb、wb、ab、br、bw、ba

f1 = open(r'./test/管理员.jpg','rb')
result=f1.read()
print(result)

b’…'—>字节

5.2 文本文件的读操作

(1) read()

#打开这个歌词文件返回一个文件对象
f = open('Control歌词.txt', 'r', encoding='utf-8')
read()将文件内容一次性全部读取出来,读取出来的结果是个字符串。
result = f.read()
print(result)
#关闭文件
f.close()

(2) readline()

#打开这个歌词文件返回一个文件对象
f = open('Control歌词.txt', 'r', encoding='utf-8')
readline()将文件内容一行一行的读取出来,每次只读一行,读取结果是个字符串
result = f.readline()
print(result)
#关闭文件
f.close()

(3) readlines()

#打开这个歌词文件返回一个文件对象
f = open('Control歌词.txt', 'r', encoding='utf-8')
readlines()将文件内容一次性读取出来,读取结果是个列表,文件中的每行内容以字符串类型保存在列表中
result = f.readlines()
print(result)
#关闭文件
f.close()

(4) with的用法

打开这个歌词文件返回一个文件对象,并给其设置一个别名f(相当于f这个变量保存了这个文件对象)

with open('Control歌词.txt', 'r', encoding='utf-8') as f:
    result = f.read()
    print(result)
print('读取完成,文件关闭')

5.3 文本文件的写操作

Python操作文件流程:
新建XXX名字的文件
写入内容
保存关闭

f = open('./test/咏鹅.txt','w',encoding='utf-8')
str1='\t咏鹅\n\t骆宾王\n鹅鹅鹅,曲项向天歌。\n白毛浮露水,红掌拨清波。'
print(str1)
f.write(str1)
f.close()
f.write('1')

出错:

ValueError: I/O operation on closed file.
I/O--Input/Out

5.4 数据分析

数据分析步骤:
第一步:采集数据(数据来源:爬虫(网络数据采集)、调查问卷收集、从专门的公司买数据、公司建
第二步:数据预处理(工具:python、excel等)
第三步:借助算法、模型等进行体系建设。
目的:降低成本、提高收益

5.5 seek和tell

seek(参数1,参数2)能够将指针移动指定的偏移量:
参数1:移动的偏移量
参数2:0 - 将指针移动到文件开头、1(默认):指针移向当前位置、2:指针移动到文件尾部

f1 = open('./test/界面.txt','r',encoding='utf-8')
print(f1.read())

将指针再移动到文件开头

f1.seek(0,0)

一个英文符号对应一个偏移量,一个汉字和一个中文符号对应3个偏移量
python中有序序列(容器)下标从0开始;
python操作文件时偏移量从1开始。
f1.seek(6,0):将指针移动到文件开头,再增加6个偏移量

print(f1.seek(6,0))

tell():查看当前指针文件的位置。

print(f1.tell())
f1.close

Linux:\n;
windows:\r\n;
mac:\r

5.6 CSV文件的读写

CSV文件的读:

方法一:使用reader类

import csv
#以utf-8编码和读模式打开学生成绩.csv文件,设置newline=''
f = open('学生成绩.csv', 'r', encoding='utf-8', newline='')
"""
使用csv模块中的reader类对文件对象进行读操作,
返回一个可迭代的reader对象,该对象对被操作的文件逐行遍历
"""
file_read = csv.reader(f)
#对这个可迭代对象进行遍历,得到的每一行内容是一个列表
for row in file_read:
    print(row)

方法二:使用DictReader类

import csv
#以utf-8编码和读模式打开学生成绩.csv文件,设置newline=''
f = open('学生成绩.csv', 'r', encoding='utf-8', newline='')
"""
使用csv模块中的DictReader类对文件对象进行读操作,
返回一个可迭代的DictReader对象,这个对象能够将文件
中的列名和对应内容映射成一个个的字典
"""
file_read = csv.DictReader(f)
#对这个可迭代对象进行遍历,得到的每一行内容是一个列表
for row_dict in file_read:
    print(row_dict)
f.close()

CSV文件的写:

方法一:使用writer类

# CSV文件本质是文本文件,只是以表格的形式展示数据。
import csv

# 使用CSV内置模块进行csv文件的读写操作

# 1.返回一个文件对象
# windows或者linux操作系统,写CSV文件必须加newline=''
# newline = ''  -->将换行转为空
f1 = open('./店铺信息.csv','w',encoding='utf-8',newline='')
print(f1)
# 2.创建写方法对象
mywrite = csv.writer(f1)
# 3.写入列名
# 单行写入:writerow()
col = ['店铺名','人均','口味','环境','服务']
mywrite.writerow(col)
# 4.写入对应信息
# 多行写入:writerows()
datas = [
    ['哄堂火锅',126,4.5,4.7,4.6],
    ['小龙坎',100,4.8,'4.8',4.7],
    ['巴蜀大门','70','4.8','4.6',4.8]
]
mywrite.writerows(datas)
f1.close()

方法二:使用DictWriter类

#导入csv模块
import csv
#以utf-8编码和写模式创建或打开学生成绩.csv文件,设置newline=''
f = open('学生成绩.csv', 'w', encoding='utf-8', newline='')
"""
使用csv模块中的DictWriter类对文件对象进行写操作,
返回一个DictWriter对象保存到file_write变量中,
fieldnames参数是由键组成的序列,它指定了字典中值的顺序,
这些值会按指定顺序传递给writerow()或writerows()写入文件
"""
file_write = csv.DictWriter(f, fieldnames=['姓名', '性别', '年龄', '成绩'])
#writeheader():将fieldnames参数指定的内容写入文件第一行
file_write.writeheader()
content = [
    {'姓名': '张三', '性别': '男', '年龄': 20, '成绩': 99},
    {'姓名': '李四', '性别': '女', '年龄': 21, '成绩': 90},
    {'姓名': '王五', '性别': '男', '年龄': 19, '成绩': 100}
]
#写入内容
"""
writerows()多行写入方式,将一个二维列表中的每一个字典分别写入一行,
每个字典的每个键值对分别写入列名对应单元格。
"""
file_write.writerows(content)
f.close()

5.6.1 酒店得平均分

import csv
# 必须
# 读数据
f1 = open('./北京高档酒店价格分析.csv', 'r', encoding='utf-8')
# 创建读文件的方法
read_data = csv.reader(f1)
data = list(read_data)
print(data)
f1.close()
# 创建新文件
f2 = open('./北京酒店信息.csv', 'w', encoding='utf-8', newline='')
# 写方法
mywrite = csv.writer(f2)
data1 = [i for i in data[0]]
data1.append('平均评分')
mywrite.writerow(data1)
# 查看数据
for info in data[1:]:
    # print(info)
    score = round((float(info[3]) + float(info[4]) + float(info[5]) + float(info[6])) / 4, 2)
    result = f'{info[0]}的平均分为:{score}'
    # print(result)
    # 将平均分重新写入文件
    info.append(score)
    mywrite.writerow(info)
f2.close()

5.6.2 房租练习题

import csv
name_list =['双流','大邑','崇州','彭州','成华','天府新区','天府新区南区','新津',
      '新都','武侯','温江','简阳','蒲江','邛崃','郫都','都江堰',
      '金堂','金牛','锦江','青白江','青羊','高新','高新西','龙泉驿']
#新建数据整合文件
file = open('./成都链家二手.csv','w',encoding='utf-8',newline='')
#创建写的方法
mywrite =csv.writer(file)
mywrite.writerow(['行政区', '标题', '小区', '街道', '户型', '面积', '装修', '单价', '总价'])
for i in name_list:
    f = open(f'./成都链家二手房数据/成都{i}二手房信息.csv','r',encoding='utf-8')
    #创建一个读方法
    read_data = csv.reader(f)
    for i in read_data:
        if i !=['行政区', '标题', '小区', '街道', '户型', '面积', '装修', '单价', '总价']:
            mywrite.writerow(read_data)
            mywrite.writerow(i)
    f.close()
file.close()
print('写入完成')

5.7 os模块读取文件名

import os
# os.listdir()
file_list = os.listdir('./成都链家二手房数据')
# file_list = os.listdir('/Users/mrfu/Desktop')
print(file_list, type(file_list))
# for i in file_list:
#     if i[-4:] == '.csv':
#         print(i)

5.8 excel读写

微软得excel
后缀名:.xls,.xlsx
.xls:excel 2007以前的文件后缀名。最多容纳256列16000+行数据。 -->xlwt、xlrd

xlsx:从 2007 开始文件使用的后缀名。最多容纳16000+列1048567行数据。
excel 2007开始兼容xls、xlsx后缀名。–>openpyxl

python能够操作excel的模块:
openpyxl、xlswriter、xlwt、pandas、xlrd、win32com、xlutils等
安装三方模块

windoms:pip install xxx
mac、linux:pip3 install xxx

如何安装模块到虚拟环境:
1.激活虚拟环境
2.(venv) -->虚拟环境已经激活
使用 venv/scripts/activate 进行虚拟环境激活
报错:微软禁用了终端执行脚本的功能。
需要解除命令:Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

查看已经安装过的模块:pip list

工作簿:一个excel文件就是一个工作簿
工作表:一个工作簿的多张表格
单元格:存储信息的方格

import openpyxl

1.新疆一个excel文件
新建文件:Workbook()

file = openpyxl.Workbook()

如果文件存在:openpyxl.load_workbook(文件路径和文件名)
2.操作工作表
创建工作表对象:create_sheet(表名,下标)
如果直接在工作簿追加工作表,下标不用写

file.create_sheet('学生成绩',0)

查看工作簿中已经存在的工作表:sheetnames

print(file.sheetnames)

移除工作表:remove(表) -->表:工作簿对象[工作表]

file.remove(file['Sheet'])

从学生成绩工作插入信息
方法一:使用cell(行号,列号)定位单元格
cell(行号、列号) -->定位单元格
value -->获取单元格内容

print(file['学生成绩'].cell(1, 1).value)
file['学生成绩'].cell(1, 1).value='姓名'
print(file['学生成绩'].cell(1, 1).value)
file['学生成绩'].cell(1, 2).value='性别'

方法二:使用[列号行号]定位单元格

file['学生成绩']['AAA1']='姓名'
print(file['学生成绩']['AAA1'].value)

保存文件

file.save('./学生成绩.xlsx')

5.9 csv文件写入xlsx

import  os
import csv
import openpyxl
# 新建xlsx后缀文件
file = openpyxl.Workbook()
# 新建工作表
file.create_sheet('成都链家二手房数据汇总')
# 从源数据文件读数据
# listdir():能够读取指定文件夹下所有的子文件
file_list = os.listdir('./成都链家二手房数据')
print(file_list)
# count作用:计数进行行号的递增
count = 0
for i in file_list:
    if i[-9:] == '二手房信息.csv' and i[:2] =='成都':
        f = open(f'./成都链家二手房数据/{i}','r',encoding='utf-8')
        read_data = csv.reader(f)
        for j in read_data:
            if j != ['行政区', '标题', '小区', '街道', '户型', '面积', '装修', '单价', '总价']:
                count += 1
                for x in range(0,len(j)):
                    #根据每一条数据长度判断写n列
                    file['成都链家二手房数据汇总'].cell(count,x+1).value=j[x]
        f.close()
file.save('./成都链家二手房.xlsx')
print('数据写入完成')

5.10 excel写入xlsx

import openpyxl

# 加载xlsx文件
file = openpyxl.load_workbook('./成都链家二手房.xlsx')
# 从工作簿中找工作表
ws = file['成都链家二手房数据汇总']
# max_row:获取xlsx文件中最大行数
rows = ws.max_row
# max_column:获取xlsx文件中最大列数
col = ws.max_column
# 行
for i in range(1, rows + 1):
    # 列
    for j in range(1, col + 1):
        print(ws.cell(i, j).value)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值