文件操作(Python和C++版)

一、C++版

程序运行时产生的数据都属于临时数据,程序—旦运行结束都会被释放通过文件可以将数据持久化

C++中对文件操作需要包含头文件< fstream >

文件类型分为两种:

1. 文本文件 - 文件以文本的ASCII码形式存储在计算机中

2. 二进制文件-  文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们

操作文件的三大类:

1. ofstream : 写操作

2. ifstream : 读操作

3. fstream : 读写操作

1.1 文本文件

1.1.1 写文件

写文件步骤如下:

1.包含头文件

        #include <fstream>

2.创建流对象

        ofstream ofs;

3.打开文件

        ofs.open("文件路径",打开方式);

4.写数据

        ofs <<"写入的数据";

5.关闭文件

        ofs.close();

文件的打开方式:

打开方式解释
ios::in为读文件而打开文件
ios::out为写文件而打开文件
ios::ate初始位置:文件尾
ios::app追加方式写文件
ios::trunc如果文件存在先删除,再创建
ios::binary二进制方法

 

注意:文件打开方式可以配合使用,利用 | 操作符

例如:用二进制方式写文件

ios::binary | ios::out

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

//文本文件 写文件
void test01() {
	//1、包含头文件 fstream
	//2、创建流对象
	ofstream ofs;

	//3、打开方式
	ofs.open("test.txt", ios::out);

	//4、写内容
	ofs << "姓名:张三" << endl;
	ofs << "性别:男" << endl;
	ofs << "年龄:18" << endl;

	//5、关闭文件
	ofs.close();
}

int main() {
	test01();

	return 0;
}

总结:

·文件操作必须包含头文件 fstream

·读文件可以利用ofstream ,或者fstream类

·打开文件时候需要指定操作文件的路径,以及打开方式

·利用<<可以向文件中写数据

·操作完毕,要关闭文件

1.1.2 读文件

读文件与写文件步骤相似,但是读取方式相对于比较多

读文件步骤如下:

1.包含头文件

        #include <fstream>

2.创建流对象

        ifstream ifs;

3.打开文件并判断文件是否打开成功

        ifs.open("“文件路径",打开方式);

4.读数据

        四种方式读取

5.关闭文件

        ifs.close();

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

//文本文件 读文件
void test01() {
	//1、包含头文件 fstream
	//2、创建流对象 
	ifstream ifs;

	//3、打开文件,并且判断是否打开成功
	ifs.open("test.txt", ios::in);

	if (!ifs.is_open()) {
		cout << "文件打开失败" << endl;
		return;
	}

	//4、读数据
	//第一种
	/*char buf[1024] = {0};
	while (ifs >> buf) {
		cout << buf << endl;
	}*/

	//第二种
	/*char buf[1024] = {0};
	while (ifs.getline(buf, sizeof(buf))) {
		cout << buf << endl;
	}*/

	//第三种
	/*string buf;
	while (getline(ifs, buf)) {
		cout << buf << endl;
	}*/

	//第四种 EOF->end of file   不推荐
	char c;
	while ((c = ifs.get()) != EOF) {
		cout << c;
	}


	//5、关闭文件
	ifs.close();
}

int main() {
	test01();

	return 0;
}

总结:

·读文件可以利用ifstream ,或者fstream类

·利用is_open函数可以判断文件是否打开成功

· close关闭文件

1.2 二进制文件

以二进制的方式对文件进行读写操作

打开方式要指定为ios::binary 

1.2.1 写文件

二进制方式写文件主要利用流对象调用成员函数write

函数原型:

ostream& write(const char * buffer,int len) ;

参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

//二进制文件 写文件
class Person {
public:
	//如果用二进制进行存储这里最好用C语言的char类型
	char m_Name[64]; //姓名 
	int m_Age;
};

void test01() {
	//1、包含头文件

	//2、创建流对象
	ofstream ofs;

	//3、打开文件
	ofs.open("test.txt", ios::out | ios::binary);

	//4、写文件
	Person p = { "张三",18 };
	//Person* 强转为 const char*类型
	ofs.write((const char*)&p, sizeof(Person));

	//5、关闭文件
	ofs.close();

}

int main() {
	test01();

	return 0;
}

1.2.2 读文件

二进制方式读文件主要利用流对象调用成员函数read

函数原型:

istream& read(char *buffer,int len);

参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

//二进制文件 读文件
class Person {
public:
	//如果用二进制进行存储这里最好用C语言的char类型
	char m_Name[64]; //姓名 
	int m_Age;
};

void test01() {
	//1、包含头文件

	//2、创建流对象
	ifstream ifs;

	//3、打开文件 判断文件是否打开成功
	ifs.open("test.txt", ios::in | ios::binary);

	if (!ifs.is_open()) {
		cout << "文件打开失败" << endl;
		return;
	}

	//4、读文件
	Person p;
	//Person* 强转为 char* 类型
	ifs.read((char*)&p, sizeof(Person));

	cout << "姓名:" << p.m_Name << " 年龄:" << p.m_Age << endl;

	//5、关闭文件
	ifs.close();

}

int main() {
	test01();

	return 0;
}

文件输入流对象可以通过read函数,以二进制方式读数据

二、Python版

1、文件操作

在学习文件操作之前,先来回顾一下编码的相关以及先关数据类型的知识。

·字符串类型(str),在程序中用于表示文字信息,本质上是unicode编码中的二进制。

name = "武沛齐"

 ·字节类型(bytes)

·可表示文字信息,本质上是utf-8/gbk等编码的二进制(对unicode进行压缩,方便文件存储和网络传输)

name = "武沛齐"
data = name.encode('utf-8')
print(data) #b'\xe6\xad\xa6\xe6\xb2\x9b\xe9\xbd\x90'

result = data.decode('utf-8')
print(result) #武沛齐

·可表示原始二进制(图片、文件等信息)

1.1 读文件

·读文本文件

"""
1.打开文件
    -路径
        相对路径:'info.txt'
        绝对路径:r"D:\python的学习\题目\info.txt"
    -模式
        rb 表示读取文件原始二进制( r, 读 read; b, 二进制 binary)
"""

#1、打开文件
file_object = open(r"D:\python的学习\题目\info.txt",mode='rb')

#2、读取文件
data = file_object.read()

#3、关闭文件
file_object.close()

print(data) #b'\xe5\xa7\x93\xe5\x90\x8d  \xef\xbc\x9a \xe6\xad\xa6\xe6\xb2\x9b\xe9\xbd\x90'

text = data.decode("utf-8")
print(text)

 改进:


#1、打开文件
# rt 读取文本内容
file_object = open("info.txt",mode='rt',encoding='utf-8')
#意思是 打开文件后 通过 utf-8 转换后再读取文本内容

#2、读取文件
data = file_object.read()

#3、关闭文件
file_object.close()

print(data) #就是文件存储的内容了,无需decode

·读图片等非文本文件


#1、打开文件
file_object = open("a1.png",mode='rb')

#2、读取文件
data = file_object.read()

#3、关闭文件
file_object.close()

print(data)

若该文件不存在,会报错

 那如何判断路径是否存在呢:

import os

exists = os.path.exists("info.txt") #返回的是 bool 值
print(exists) #True

1.2 写文件

·写文本文件

# 1、打开文件
#   路径:相对/绝对
#   模式:wb (要求写入的内容需要是二进制字节类型)
file_object = open("t1.txt", mode='wb')

# 2、写入内容
file_object.write("武沛齐".encode("utf-8"))

# 3、文件关闭
file_object.close()

改进:

# 1、打开文件
#   路径:相对/绝对
#   模式:wt
#   如果不写 encoding 会以默认值 utf-8 写入
file_object = open("t1.txt", mode='wt',encoding='utf-8')

# 2、写入内容
file_object.write("武沛齐")

# 3、文件关闭
file_object.close()

·写图片等文件

# 相当于复制了一份
f1 = open("a1.png", mode='rb')
content = f1.read()
f1.close()

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

注意的是,w写入文件时,先清空文件;再在文件中写入内容

而且如果路径没有该文件,w模式会新建然后再写入内容

所以如果你要写入时,在循环里实现写入,循环前后只实现一次的打开和关闭

file_object = open('test.txt',mode='wt')

while True:
    user = input("请输入用户名:")
    if user.upper() == "Q":
        break
    pwd = input("请输入密码:")
    #data = "{}--{}\n".format(user,pwd)
    data = f"{user}--{pwd}\n"

    file_object.write(data)
file_object.close()

效果

wjw--123
pxy--456

1.3   文件打开方式

关于文件的打开模式常见应用有:

r w x a 的默认为 rt wt xt at

模式文件存在文件不存在

只读

r、rt、rb

报错

只有

w、wt、wb

清空再写创建再写

只写(了解即可)

x、xt、xb

报错创建再写

只写

a、at、ab

【尾部追加】

尾部追加创建再写

读写

r+、rb        默认光标位置:起始位置
w+、wb        默认光标位置:起始位置(清空文件)
x+、xb        默认光标位置:起始位置(新文件)
a+、ab+        默认光标位置:末尾

 

# rt+

file_object = open("info.txt",mode="rt+",encoding='utf-8')
#读取内容
data = file_object.read()

print(data)

#写入内容
file_object.write("你好啊!")
file_object.close()


# rt+

file_object = open("info.txt",mode="rt+",encoding='utf-8')

#写入内容
file_object.write("你好啊!")

#读取内容
data = file_object.read()

print(data)

file_object.close()

结果是不同的,这里与文件的光标有关

rt+ 默认光标位置是起始位置,如果先写入就会往后覆盖,再读取的时候也会从光标开始往后读取

如果先读取光标会移至最后,然后再写入

对于wt+


# wt+

file_object = open("info.txt",mode="wt+",encoding='utf-8')

#读取内容,由于wt+会清空内容,所以必定为空
data = file_object.read()
print(data)

#写入内容,此时写入后光标会移至最后
file_object.write("你好啊!")


#再想读取内容,光标要移至最前面,就ok了
file_object.seek(0)
data = file_object.read()
print(data)


file_object.close()

对于at+


# at+

file_object = open("info.txt",mode="at+",encoding="utf-8")


#写入内容,at+光标开始在最后,直接末尾追加
file_object.write("你好啊!")


#想读取内容,光标要移至最前面,就ok了
file_object.seek(0)
data = file_object.read()
print(data)


file_object.close()

1.4 常见功能

在上述对文件的操作中,我们只使用了write和read来对文件进行读写,其实在文件操作中还有很多其他的功能来辅助实现更好的读写文件的内容。

1、read,读所有

f = open('info.txt',mode='r',encoding='utf-8')
data = f.read()
print(data)

2、read,读一个字符(三个字节)

f = open('info.txt',mode='r',encoding='utf-8')
data = f.read(1)
f.close()
print(data)

3、read,读一个字节

f = open('info.txt',mode='rb')
data = f.read(1)
f.close()
print(data)

4、readline,读一行

f = open('info.txt',mode='r',encoding='utf-8')
data = f.readline()

print(data)

f.close()

5、readlines,读所有行,每行作为列表的一个元素

f = open('info.txt',mode='r',encoding='utf-8')
data = f.readlines()

print(data)

f.close()

6、循环,读大文件(readline加强版)

while循环难以判断其终止操作,所以用 for

f = open('info.txt',mode='r',encoding='utf-8')

for line in f:
    print(line.strip())

f.close()

7、flush,刷到硬盘

f = open('info.txt',mode='w',encoding='utf-8')

for i in range(0,3):
    #不是写到了硬盘,而是写在缓冲区,系统会将缓冲区的内容刷到硬盘
    f.write("你好啊!")
    #写上flush之后,立即刷到yingpanl
    f.flush()
    print(1)


f.close()

8、seek() 移动光标位置(字节)

f = open('info.txt',mode='r+',encoding='utf-8')

#移动光标位置,在次光标之后开始写内容,如果有内容,则会覆盖
#移动到指定字节的位置,最好是3的倍数,否则会发生乱码的情况
f.seek(3)
f.write("中国")


f.close()

注意︰在a模式下,调用write在文件中写入内容时,永远只能将内容写入到尾部,不会写到光标的位置。

9、tell() 获取当前光标的位置

f = open('info.txt', mode='r+', encoding='utf-8')

p1 = f.tell()
print(p1)  # 0
f.read(2)  # 读取的是字符 2 * 3 个字节
p2 = f.tell()
print(p2)  # 6

f.close()
f = open('info.txt', mode='rb')

p1 = f.tell()
print(p1)  # 0
f.read(3)  # 读取的是3 个字节
p2 = f.tell()
print(p2)  # 3

f.close()

1.5 上下文管理

之前对文件进行操作时,每次都要打开和关闭文件,比较繁琐且容易忘记关闭文件。以后再进行文件操作时,推荐大家使用with上下文管理,它可以自动实现关闭文件。

writh open ( ”xxXX,txt" , mode= "rb" ) as file_object :
    data = file_object.read()
    print (data)

在Python 2.7后,with又支持同时对多个文件的上下文进行管理,即:

with open (“x展x据.txt",mode="rb") as f1,open ( "%x×xtxt”,mode="rb" ) as f2:
    pass

2、CSV格式文件

逗号分隔值(Comma-separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。对于这种格式的数据,我们需要利用open函数来读取文件并根据逗号分隔的特点来进行处理。

股票代码,股票名称,当前价,涨跌额,涨跌幅,年初至今

601778,t晶科,6.29,+1.92 ,-43.94%,+43.948%

688566,吉贝尔。52.66,+6.96,+15.238,+122.29....

with open('cs.csv', mode='r',encoding='utf-8') as f:
    f.readline()
    for line in f:
       id,year,bl = line.strip().split(',')
       print(id,year)

3、ini格式

ini文件是Initialization File的缩写,平时用于存储软件的的配置文件。例如:MySQL数据库的配置文件。

[DataBase]
ServerIP=**********
ServerPort=8080
ControlConnectString=QWDJ7+XH6oWaANAGhVgh5/5UxYrA2rfz/ufAkDlN1H9Tw+v7Z0SoCfR+wYdyzCjF/ANUfPxlO6cLDAhm4xxmbADyKs6zmkWuGQNgDZmPx6c=
ControlConnectCategory=0
 
[LogonInfo]
SaveUserID=Y
UserID=admin
DBServer=AppDB
DBCenter=Demo
 
[UserConfig]
OpenDownloadFileAtOnec=Y
WindowStyle=DevExpress Dark Style
 
[Language]
Language=CHS
 
 
[AutoUpdate]
Version=1.1

 这种格式是可以直接使用open来出来,考虑到自己处理比较麻烦,所以Python为我们提供了更为方便的方式。

3.1 读取所有节点

import configparser

config = configparser.ConfigParser()
config.read('in.ini',encoding='utf-8')

#获取节点,列表形式
result = config.sections()
print(result)

3.2 读取节点下的键值

import configparser

config = configparser.ConfigParser()
config.read('in.ini',encoding='utf-8')

#该节点下的键值,返回的是列表里的元组
result = config.items('LogonInfo')
print(result)

3.3 获取某个节点下的键值对应的值

import configparser

config = configparser.ConfigParser()
config.read('in.ini',encoding='utf-8')

result = config.get("UserConfig","WindowStyle")
print(result)

3.4 其他

import configparser

config = configparser.ConfigParser()
config.read('in.ini',encoding='utf-8')

#判断是否有该节点
v1 = config.has_section("UserConfig")
print(v1)

#增加一个节点
config.add_section("group")
#此时并未写入,所以要写write(),这里可以换别的名字,重新创建一个文件
config.write(open('in.ini',mode='w',encoding='utf-8'))

#增加键值
config.set("group","name","wjw")
config.write(open('in.ini',mode='w',encoding='utf-8'))

#删除节点
config.remove_section('Language')
config.write(open('in.ini',mode='w',encoding='utf-8'))

#删除键值
config.remove_option("LogonInfo","userid")
config.write(open('in.ini',mode='w',encoding='utf-8'))

4、XML格式文件

        暂时用不到哈,先不学了

5、Excel格式文件

Python内部未提供处理Excel文件的功能,想要在Python中操作Excel需要按照第三方的模块。

pip install openpyxl

此模块中集成了Python操作Excel的相关功能,接下来我们就需要去学习该模块提供的相关功能即可。

5.1 读文件

1.读sheet

from openpyxl import load_workbook

wb = load_workbook("1.xlsx")

#1、获取excel文件中的所有sheet名称
#print(wb.sheetnames) #['sheet2', 'Sheet1']

#2、选择sheet,基于sheet名称
"""
sheet = wb["Sheet1"]
#读取单元格
cell = sheet.cell(1,1)
print(cell.value)
"""

#3、选择sheet,基于索引位置
"""
sheet = wb.worksheets[0]
cell = sheet.cell(3,1)
print(cell.value)
"""

#4、循环所有的sheet
"""
for name in wb.sheetnames:
    sheet = wb[name]
    cell = sheet.cell(3,1)
    print(cell.value)
"""
"""
for sheet in wb.worksheets:
    cell = sheet.cell(3, 1)
    print(cell.value)
"""
for sheet in wb:
    cell = sheet.cell(3,1)
    print(cell.value)
from openpyxl import load_workbook

wb = load_workbook("1.xlsx")
sheet = wb.worksheets[0]

#1、获取第N行第N列的单元格
"""
cell = sheet.cell(3,1)
print(cell.value)
print(cell.font)
print(cell.style)
print(cell.alignment) #排列情况
"""

#2、获取某个单元格
"""
c1 = sheet["B3"]
print(c1.value)

c2 = sheet["C4"]
print(c2.value)
"""

#3、第N行所有的单元格
"""
for cell in sheet[3]:
    print(cell.value)
"""

#4、所有行的数据
"""
for row in sheet.rows:
    #获得的是元组
    print(row[2].value)
"""

#5、所有列的数据
"""
for col in sheet.columns:
    print(col[2].value)
"""

2.读合并的单元格

 

from openpyxl import load_workbook

wb = load_workbook("1.xlsx")
sheet = wb.worksheets[1]

c1 = sheet.cell(1,1)
print(c1.value) #测试数据

c2 = sheet.cell(1,2)
print(c2.value) #None

 合并单元格显示最前面的,其他的都置为空

5.2 写Excel

在Excel中想要写文件,大致要分为

1.原Excel文件基础上写内容

from openpyxl import load_workbook

wb = load_workbook("1.xlsx")
sheet = wb.worksheets[1]

# 找到单元格,并修改单元的内容
cell = sheet.cell(9,1)
cell.value = "wjm"

#将excel文件保存到2.xlsl文件中
wb.save("2.xlsx")

2.新创建Excel文件写内容

from openpyxl import workbook

#创建excel且默认会创建一个sheet(名称为Sheet)
wb = workbook.Workbook()

sheet = wb.worksheets[0] #或 sheet = wb["Sheet"]

#找到单元格,并修改单元格的内容
cell = sheet.cell(1,1)
cell.value = "新的开始"

#将excel文件保存到3.xlsx文件中
wb.save("3.xlsx")

拓展:

from openpyxl import workbook

wb = workbook.Workbook()

#1、修改sheet名称
"""
sheet = wb.worksheets[0]
sheet.title = "数据集"
wb.save ( "p2.xlsx")
"""

#2、创建sheet并设置sheet颜色
"""
sheet = wb.create_sheet("工作计划",0)
sheet.sheet_properties.tabcolor = "1072BA"
wb.save("p2.xlsx")
"""

#3、默认打开的sheet
"""
wb.active = o
wb.save("p2.xlsx")
"""

#4、拷贝sheet
"""
sheet = wb.create_sheet ("工作计划")
sheet.sheet_properties.tabColor = "1072BA"
new_sheet = wb.copy_worksheet(wb["sheet"])
new_sheet.title = "新的计划"
wb.save("p2.xlsx")
"""

#5、删除sheet
"""
del wb["用户列表"]
wb.save("p2.xlsx")
"""

还有

from openpyxl import load_workbook
from openpyxl.styles import Alignment, Border, Side, Font, PatternFill, GradientFill

wb = load_workbook("1.xlsx")
sheet = wb.worksheets[0]

# 1.获取某个单元格,修改值
"""
cell = sheet.cell(1,1)
cell.value = "开始"
wb.save("2.xlsx")
"""

# 2.获取某个单元格,修改值
"""
sheet["B2"]= "开始"
wb.save("2.xlsx")
"""

# 3.获取某些单元格,修改值
"""
cell_list = sheet["B2":"C3"] #4个单元格
#(
#   (单元格,单元格)
#   (单元格,单元格)
#)
for row in cell_list:
    for cell in row:
        cell.value = "新的值"
wb.save("2.xlsx")
"""

# 4.对齐方式
"""
cell = sheet.cell(1,1)
#horizontal 水平方向对齐方式:general left center right fill justify centerContinous distributed
#vertical  垂直方向对齐方式:top center bottom justify distributed
#text_rotation 旋转角度
#wrap_text 是否自动换行
cell.alignment = Alignment(horizontal='center',vertical='center',text_rotation=45,wrap_text=True)
wb.save("2.xlsx")
"""

# 5.边框
# side 的 style 如下:dashDot dashDotDot dashed dotted double hair medium mediumDashDot mediumDashDot mediumDashed slantDashDot thick thin
"""
cell = sheet.cell(9,2)
cell.border = Border(
    top = Side(style="thin",color="FFB6C1"),
    bottom=Side(style="dashed",color="FFB6C1"),
    left=Side(style="dashed",color="FFB6C1"),
    right=Side(style="dashed",color="9932cC"),
    diagonal=Side(style="thin",color="483D8B"),#对角线
    diagonalup=True, #左下 ~右上
    dliagonalDown=True #左上 –右下
)
wb.save("2.xlsx")
"""

# 6.字体
"""
cell = sheet.cell(5,1)
cell.font = Font(name="微软雅黑",size=45,color="ff0000",underline="single")
wb.save("2.xlsx")
"""

# 7.背景色
"""
cell = sheet.cell(5,1)
cell.fill = PatternFill("solid",fgColor="99ccff")
wb.save("2.xlsx")
"""

# 8.渐变背景色
"""
cell = sheet.cell(5,1)
cell.fill = GradientFill("linear",stop=("FFFFFF","99ccff","000000"))
wb.save("2.xlsx")
"""

# 9.宽高 (索引从1开始)
"""
sheet.row_dimensions[1].height = 50
sheet.columns_dimensions["E"].width = 100
wb.save("2.xlsx")
"""

# 10.合并单元格
"""
sheet.merge_cells("B2:D8")
sheet.merge_cells(start_row=15,start_column=3,end_row=18,end_column=8)
wb.save("2.xlsx")
"""

# 11.写入公式
"""
sheet = wb.worksheets[1]
sheet["D1"] = "合计"
sheet["D2"] = "=B2*C2"
wb.save("2.xlsx")
"""
"""
sheet = wb.worksheets[1]
sheet["D3"] = "=SUM(B3,C3)"
wb.save("2.xlsx")
"""

# 12.删除
"""
#idx. 要删除的索引位置
#amount 从索引位置开始要删除的个数(默认为1)
sheet.delete_cols(idx=1,amount=1)
sheet.delete_rows(idx=1,amount=2)
wb.save("2.xlsx")
"""

# 13.插入
"""
sheet.insert_cols(idx=5,amount=10)
sheet.insert_rows(idx=3,amount=2)
wb.save("2.xlsx")
"""

# 14.循环写内容
"""
sheet = wb["Sheet"]
cell_range = sheet["A1:C2"]
for row in cell_range:
    for cell in row:
        cell.value = "xx"

for row in sheet.iter_rows(min_row=5,min_col=1,max_row=7,max_col=10):
    for cell in row:
        cell.value = "oo"
wb.save("2.xlsx")
"""

# 15.移动
"""
# 将H2:J10范围的数据,向右移动15个位置、向上移动1个位置
sheet.move_range("H2:J10", rows=-1, cols=15)
wb.save("p2.xlsx")
"""
"""
sheet = wb.worksheets[3]
sheet["D1"] = "合计"
sheet["D2"] = "=SUM(B3,C3)"
sheet.move_range("B1:D3",cols=10,translate=True)#自动翻译公式
wb.save("2.xlsx")
"""


#16.打印区域
"""
sheet.print_area = "A1:D200"
wb.save("2.xlsx")
"""

#17.打印时,每个页面的固定表头
"""
sheet.print_title_cols = "A:D"
sheet.print_title_rows = "1:3"
wb.save("2.xlsx")
"""

你以为结束了吗?

并没有,因为我学校考的是CSV文件我们要用csv模板,Excel用 xlrd 和 xlwt 模板学习,下面我们继续学习

CSV

1.导入模块

Python有内置CSV模块,导入这个模块后,可以很轻松读取CSV文件。

import csv

读写文件

·open()打开文件使用完毕后必须close()关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的

·with open(x) as x:打开的文件使用关闭后不需要主动关闭文件。因为with语句的上下文管理器会帮助处理。这在操作资源文件时非常方便,因为它能确保在代码执行完毕后资源会被释放掉

2.读取CSV文件

1.使用open()打开CSV文件

csvFile = open(文件名) #打开文件建立 CSV 文件对象 csvFile

 2.使用with打开CSV文件

with open(文件名)as csvFile: # csvFi1e是可以自行命名的文件对象

        ....

 2.1.建立reader对象

·有了CSV文件对象后,下一步可以使用c5v模块的 reader()建立 reader对象,可以使用list()将这个reader 对象转换成列表(list),现在我们可以很轻松地使用这个列表资料了。

import  csv

fn = 'cs.csv'
with open(fn) as csvFile: #打开csv文件
    csvReader = csv.reader(csvFile) #读文件建立Reader对象

2.2 读取CSV文件

import  csv

fn = 'cs.csv'
with open(fn) as csvFile: #打开csv文件
    csvReader = csv.reader(csvFile) #读文件建立Reader对象
    listReport = list(csvReader) #将数据转换为列表

print(listReport[0][1])#打印即可

 3.1.建立writer对象

import  csv

fn = 'cs.csv'
with open(fn,"w") as csvFile: #打开csv文件
    csvWriter = csv.writer(csvFile) #写文件建立writer对象 

3.2 写入CSV文件

import  csv

fn = 'cs.csv'
with open(fn,"w") as csvFile: #打开csv文件
    csvWriter = csv.writer(csvFile) #写文件建立writer对象
    csvWriter.writerow(['Name',"Age","City"])
    csvWriter.writerow(['wjw','25','TaiBei'])

EXCEL

方式功能文件格式
xlrd只能读xls , xlsx
xlwt只能写只能xls格式

 xlrd

import xlrd
#打开文件
book = xlrd.open_workbook('1.xlsx')
#读取指定sheet:

print(book.sheets())#获取全部sheet

sheet = book.sheet_by_index(0) #根据索引获取工作表

sheet = book.sheet_by_name("Sheet1") #根据sheetname进行获取

print(book.sheet_names())#获取所有工作表name

print(book.nsheets)#返回工作表数量
#获取行和列数
rows = sheet.nrows
cols = sheet.ncols

操作行

import xlrd

#打开文件
book = xlrd.open_workbook('1.xlsx')

#操作excel行
sheet=book.sheet_by_index(1)#获取第一个工作表
print(sheet.nrows)#获取sheet下的有效行数
print(sheet.row(1))#该行单元格对象组成的列表
print(sheet.row_types(2))#获取单元格的数据类型
print(sheet.row(1)[2].value)#得到单元格value
print(sheet.row_vaiues(1))#得到指定行单元格的value
print(sheet.row_values(1))#得到指定行单元格的value
print(sheet.row_len(1))#得到单元格的长度

操作列

import xlrd

#打开文件
book = xlrd.open_workbook('1.xlsx')

#操作excel列
sheet=book.sheet_by_index(1)#获取第一个工作表
print(sheet.ncols)#获取sheet下的有效列数
print(sheet.col(1))#该行单元格对象组成的列表
print(sheet.col_types(2))#获取单元格的数据类型
print(sheet.col(1)[2].value)#得到单元格value
print(sheet.col_vaiues(1))#得到指定列单元格的value
print(sheet.col_values(1))#得到指定列单元格的value
print(sheet.col_len(1))#得到单元格的长度

操作Excel单元格

import xlrd

#打开文件
book = xlrd.open_workbook('1.xlsx')

#操作Excel单元格
sheet=book.sheet_by_index(0)
print(sheet.cell(1,2))
print(sheet.cell_type(1,2))
print(sheet.cell(1,2).ctype) #获取单元格数据类型
print(sheet.cell(1,2).value)
print(sheet.cell_value(1,2))

xlwt

import xlwt

titlestyle = xlwt.XFStyle() #初始化样式
titlefont = xlwt.Font()
titlefont.name = "宋体"
titlefont.bold = True #加粗
titlefont.height = 11*20 #字号
titlefont.colour_index = 0x08 #设置字体颜色
titlestyle.font = titlefont

#单元个对齐方式
cellalign = xlwt.Alignment()
cellalign.horz = 0x02
cellalign.vert = 0x01
titlestyle.alignment = cellalign

#边框
borders = xlwt.Borders()
borders.right=xlwt.Borders.DASHED
borders.bottom=xlwt.Borders.DOTTED
titlestyle.borders = borders

#
datestyle = xlwt.XFStyle()
bgcolor = xlwt.Pattern()
bgcolor.pattern = xlwt.Pattern.SOLID_PATTERN
bgcolor.pattern_fore_colour = 22 #背景颜色
datestyle.pattern = bgcolor

#第一步:创建工作簿
wb=xlwt.Workbook()
#第二步:创建工作表
ws=wb.add_sheet("CNY")
#第三步:填充数据
ws.write_merge(0,1,0,5,"2019年货币兑换表",titlestyle)
#写入货币数据
data = (("Date","英镑","人民币","港币","日元","美元")
    ,("01/01/2019",8.722551,1,0.877885,0.062722,6.8759),
        ("02/01/2019",8.634922,1,0.875731,0.062773,6.8601))
for i , item in enumerate(data):
#enumerate 包含索引
    for j , val in enumerate(item):
        if j==0:
            ws.write(i + 2, j, val,datestyle)
        else:
            ws.write(i + 2,j,val)

#第四步:保存
wb.save("2019-CNY.xls")



就这样吧,我累了,再见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/696230.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【图解IO与Netty系列】Netty核心组件解析

Netty核心组件解析 Bootstrap & ServerBootstrapEventLoop & EventLoopGroupChannelChannelHandler & ChannelPipeline & ChannelHandlerContextChannelHandlerChannelPipelineChannelHandlerContext ChannelFuture Bootstrap & ServerBootstrap Bootstra…

免费!GPT-4o发布,实时语音视频丝滑交互

We’re announcing GPT-4o, our new flagship model that can reason across audio, vision, and text in real time. 5月14日凌晨&#xff0c;OpenAI召开了春季发布会&#xff0c;发布会上公布了新一代旗舰型生成式人工智能大模型【GPT-4o】&#xff0c;并表示该模型对所有免费…

AI智能体做高考志愿填报分析

关注公众号&#xff0c;赠送AI/Python/Linux资料&#xff0c;对AI智能体有兴趣的朋友也可以添加一起交流 高考正在进行时&#xff0c;学生焦虑考试&#xff0c;家长们焦虑的则是高考志愿怎么填。毕竟一个好的学校&#xff0c;好的专业是进入社会的第一个敲门砖 你看张雪峰老师…

Tomcat源码解析(八):一个请求的执行流程(附Tomcat整体总结)

Tomcat源码系列文章 Tomcat源码解析(一)&#xff1a;Tomcat整体架构 Tomcat源码解析(二)&#xff1a;Bootstrap和Catalina Tomcat源码解析(三)&#xff1a;LifeCycle生命周期管理 Tomcat源码解析(四)&#xff1a;StandardServer和StandardService Tomcat源码解析(五)&…

Python opencv读取深度图,网格化显示深度

效果图&#xff1a; 代码&#xff1a; import cv2 import osimg_path "./outdir/180m_norm_depth.png" depth_img cv2.imread(img_path, cv2.IMREAD_ANYDEPTH) filename os.path.basename(img_path) img_hig, img_wid depth_img.shape # (1080, 1920) print(de…

设计模式- 责任链模式(行为型)

责任链模式 责任链模式是一种行为模式&#xff0c;它为请求创建一个接收者对象的链&#xff0c;解耦了请求的发送者和接收者。责任链模式将多个处理器串联起来形成一条处理请求的链。 图解 角色 抽象处理者&#xff1a; 一个处理请求的接口&#xff0c;可以通过设置返回值的方…

Python基础教程(八):迭代器与生成器编程

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

Buildroot和Debian文件系统修改方法

本文档主要介绍在没有编译环境的情况下&#xff0c;如何修改buildroot和debian文件系统方法&#xff0c;如在buildroot文件系统中添加文件、修改目录等文件操作&#xff0c;在debian文件系统中&#xff0c;安装软件库、工具、扩大文件系统空间等等操作。 1.Debian文件系统 …

【Python从入门到进阶】57、Pandas入门:背景、应用场景与基本操作

一、引言 1、Pandas简介 在数字化时代&#xff0c;数据已经成为企业决策和个人洞察的重要基础。无论是金融市场的波动、零售业的销售趋势&#xff0c;还是科研实验的结果&#xff0c;都蕴含在大量的数据之中。然而&#xff0c;如何有效地提取、分析和解读这些数据&#xff0c…

嵌入式应用之FIFO模块原理与实现

FIFO介绍与原理 FIFO是First-In First-Out的缩写&#xff0c;它是一个具有先入先出特点的缓冲区。FIFO在嵌入式应用的非常广泛&#xff0c;可以说有数据收发的地方&#xff0c;基本就有FIFO的存在。或者为了降低CPU负担&#xff0c;提高数据处理效率&#xff0c;可以在积累到一…

2、数据操作

索引从0开始 一行 [1,:] 一列[:,1] 子区域&#xff1a;[1:3,1:] 第一行和第二行&#xff0c;从第一列开始 [::3,::2] 每3行一跳&#xff0c;每2列一跳 torch.tensor([[1,2,3,4]] 按位置算 xy ,x-y x*y x**y&#xff08;幂&#xff09; 1、广播机制形状不一样&#xff0c;…

一个简单好用的 C# Easing Animation 缓动动画类库

文章目录 1.类库说明2.使用步骤2.1 创建一个Windows Form 项目2.2 安装类库2.3 编码2.4 效果 3. 扩展方法3.1 MoveTo 动画3.2 使用回调函数的Color动画3.3 属性动画3.4 自定义缓动函数 4.该库支持的内置缓动函数5.代码下载 1.类库说明 App.Animations 类库是一个很精炼、好用的…

C-MAPSS数据集探索性分析

实验数据为商用模块化航空推进系统仿真C-MAPSS数据集&#xff0c;该数据集为NASA格林中心为2008年第一届预测与健康管理国际会议(PHM08)竞赛提供的引擎性能退化模拟数据集&#xff0c;数据集整体信息如下所示&#xff1a; 涡扇发动机仿真模拟模型如下图所示。 仿真建模主要针对…

【前端】使用window.print() 前端实现网页打印详细教程(含代码示例)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

Vuex3学习笔记

文章目录 1&#xff0c;入门案例辅助函数 2&#xff0c;mutations传参辅助函数 3&#xff0c;actions辅助函数 4&#xff0c;getters辅助函数 5&#xff0c;模块拆分6&#xff0c;访问子模块的state辅助函数 7&#xff0c;访问子模块的getters辅助函数 8&#xff0c;访问子模块…

Java--递归

1.递归就是A方法调用A方法&#xff0c;也就是调用自己本身 2.利用递归可以用简单的程序来解决一些复杂的问题&#xff0c;它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解&#xff0c;递归策略只需少量的程序就可描述出解题过程所需要的多次重复…

【MySQL数据库】:MySQL索引特性

目录 索引的概念 磁盘 磁盘的基本特征 MySQL与磁盘交互的基本单位 索引的理解 建立测试表 理解单个Page 理解多个Page 页目录 单页情况 多页情况 索引的数据结构 聚簇索引 VS 非聚簇索引 索引操作 创建主键索引 创建唯一索引 创建普通索引 创建全文索引 查询…

Nginx服务配置

一、Nginx服务的主配置文件nginx.conf vim /usr/local/nginx/conf/nginx.conf 全局块&#xff1a;全局配置&#xff0c;对全局生效&#xff1b;events块&#xff1a;配置影响 Nginx 服务器与用户的网络连接&#xff1b;http块&#xff1a;配置代理&#xff0c;缓存&#xff0c…

重温共射放大电路

1、放大概念 小功率信号变成一个大功率信号&#xff0c;需要一个核心器件做这件事&#xff0c;核心器件的能量由电源提供&#xff0c;通过核心器件用小功率的信号去控制大电源&#xff0c;来实现能量的转换和控制&#xff0c;前提是不能失真&#xff0c;可以用一系列正弦波进行…

conda 创建环境失败

conda create -n pylableimg python3.10在conda &#xff08;base&#xff09;环境下&#xff0c;创建新的环境&#xff0c;失败。 报错&#xff1a; LookupError: didn’t find info-scipy-1.11.3-py310h309d312_0 component in C:\Users\Jane.conda\pkgs\scipy-1.11.3-py310h…