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

news2024/12/25 1:43:32

一、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")



就这样吧,我累了,再见

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【InternLM实战营第二期笔记】06:Lagent AgentLego 智能体应用搭建

文章目录 讲解为什么要有智能体什么是 Agent智能体的组成智能体框架AutoGPTReWooReAct Lagent & Agent LegoAgentLego 实操Lagent Web Demo自定义工具 AgentLego&#xff1a;组装智能体“乐高”直接使用作为智能体&#xff0c;WebUI文生图测试 Agent 工具能力微调 讲解 为…

DDMA信号处理以及数据处理的流程---原始数据生成

Hello&#xff0c;大家好&#xff0c;我是Xiaojie&#xff0c;好久不见&#xff0c;欢迎大家能够和Xiaojie一起学习毫米波雷达知识&#xff0c;Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程&#xff0c;本系列文章将从目标生成、信号仿真、测距、测速、cfar…

【VUE3 element时间选择器默认选择七天】

VUE3 element时间选择器默认选择七天 <el-date-pickerv-model"form.timeRange"type"datetimerange"start-placeholder"开始时间"end-placeholder"结束时间"format"YYYY-MM-DD HH:mm:ss"date-format"YYYY/MM/DD dd…

vivado HW_ILA_DATA、HW_PROBE

HW_ILA_DATA 描述 硬件ILA数据对象是ILA调试核心上捕获的数据的存储库 编程到当前硬件设备上。upload_hw_ila_data命令 在从ila调试移动捕获的数据的过程中创建hw_ila_data对象 核心&#xff0c;hw_ila&#xff0c;在物理FPGA上&#xff0c;hw_device。 read_hw_ila_data命令还…

定个小目标之刷LeetCode热题(12)

这是一道简单题&#xff0c;使用位运算中的异或运算即可&#xff0c;异或运算有以下性质&#xff1a; 1、任何数异或 0 结果仍然是原来的数&#xff0c;即 a⊕0a 2、任何数和其自身做异或运算&#xff0c;结果是 0 所以我们只需要让数组里的所有元素进行异或运算得到的结果就…

深入解析ETL与ELT架构:数据集成技术的演进与发展

摘要&#xff1a;随着大数据时代的到来&#xff0c;数据集成成为企业信息化建设的重要环节。本文将深入探讨ETL与ELT两种架构&#xff0c;分析它们在数据处理、性能、可扩展性等方面的差异&#xff0c;为企业数据集成提供技术指导。 一、引言 在大数据时代&#xff0c;企业需要…

【Vue】获取模块内的state数据

目标&#xff1a; 掌握模块中 state 的访问语法 尽管已经分模块了&#xff0c;但其实子模块的状态&#xff0c;还是会挂到根级别的 state 中&#xff0c;属性名就是模块名 使用模块中的数据 直接通过模块名访问 $store.state.模块名.xxx 通过 mapState 映射&#xff1a; 默认…

Java网络通信实现

UDP UDPServer import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket;public class UDPServer {public static void main(String[] args) throws IOException {System.out.println("UdpServer启动");// 创建upd套接字Data…

PE文件(七)扩大节合并节数据目录

添加shellcode有以下几种的方式&#xff1a; 1.直接在任意节的空白区添加代码 2.新增节添加代码 3.扩大最后一个节添加代码 4.合并节并添加代码 今天我们学习如何扩大节&#xff0c;合并节 扩大节 在上一节的学习中&#xff0c;我们可以通过上移NT头和节表覆盖DOS Stub以…

VBA即用型代码手册:删除重复行Delete Duplicate Rows

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…

【python】python化妆品销售logistic逻辑回归预测分析可视化(源码+课程论文+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

基于51单片机的车辆动态称重系统设计

一 动态称重 所谓动态称重是指通过分析和测量车胎运动中的力,来计算该运动车辆的总重量、轴重、轮重和部分重量数据的过程。动态称重系统按经过车辆行驶的速度划分,可分为低速动态称重系统与高速动态称重系统。因为我国高速公路的限速最高是120,所以高速动态称重系统在理论…

按键精灵在Win11中弹窗出现乱码并且自带的部分系统插件不能使用的解决方法

按键精灵中出现以下问题&#xff1a; 提示信息的弹窗出现乱码&#xff1a; 系统自带的部分像 plugin. 开头的插件不能使用&#xff0c;如下&#xff1a;s Plugin.Sys.GetDateTime() screenX Plugin.GetSysInfo.GetScreenResolutionX screenY Plugin.GetSysInfo.GetScreenRe…

线程知识点总结

Java线程是Java并发编程中的核心概念之一&#xff0c;它允许程序同时执行多个任务。以下是关于Java线程的一些关键知识点总结&#xff1a; 1. 线程的创建与启动 继承Thread类&#xff1a;创建一个新的类继承Thread类&#xff0c;并重写其run()方法。通过创建该类的实例并调用st…

【C语言】插入排序(经典算法,建议收藏!!!)

目录 1、原理2、代码展示3、解析代码4、适用场景 1、原理 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;其原理可以简述如下&#xff1a; 1.分已排序区间和未排序区间: 将数组分为已排序区间和未排序区间。初始时&#xff0c;已排序区…

Vue3父组件如何访问子组件属性和方法

本篇内容主要是父组件如何访问子组件的属性和方法 文章目录 子组件 //son.vue代码const list (info) >{console.log(info) }const name ref("XXXX")//子组件向父组件暴露了一个方法&#xff0c;然后父组件就可以去使用子组件里面的一些属性和方法了 //子组件向…

突破网络屏障:掌握FRP内网穿透技术

1.FRP介绍 1.frp是什么 frp 是一款高性能的反向代理应用&#xff0c;专注于内网穿透。它支持多种协议&#xff0c;包括 TCP、UDP、HTTP、HTTPS 等&#xff0c;并且具备 P2P 通信功能。使用 frp&#xff0c;您可以安全、便捷地将内网服务暴露到公网&#xff0c;通过拥有公网 I…

Python 潮流周刊#55:分享 9 个高质量的技术类信息源!

大家好&#xff0c;我是猫哥&#xff0c;今天给大家分享几个高质量的技术类信息源。 本文分享的信息源都是周刊类型的&#xff0c;所谓周刊类&#xff0c;就是以固定每周的频率更新&#xff0c;每期分享很多精华内容的链接。它的特点是信息密度极高&#xff0c;可以节省你去查…

log4j日志打印导致OOM问题

一、背景 某天压测&#xff0c;QPS压到一定值后机器就开始重启&#xff0c;出现OOM&#xff0c;好在线上机器配置了启动参数-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/**/**heapdump.hprof。将dump文件下载到本地&#xff0c;打开Java sdk bin目录下的jvisualvm工具&a…

2024PTA算法竞赛考试编程题代码

目录 前言 题目和代码 L1-006 连续因子 L1-009 N个数求和 L2-004 这是二叉搜索树吗&#xff1f; L2-006 树的遍历 L2-007 家庭房产 L4-118 均是素数 L4-203 三足鼎立 L2-002 链表去重 L2-003 月饼 L2-026 小字辈 L4-201 出栈序列的合法性 L4-205 浪漫侧影 前言 所…