文件操作(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 osexists = 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":breakpwd = 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之后,立即刷到yingpanlf.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)  # 6f.close()
f = open('info.txt', mode='rb')p1 = f.tell()
print(p1)  # 0
f.read(3)  # 读取的是3 个字节
p2 = f.tell()
print(p2)  # 3f.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 configparserconfig = configparser.ConfigParser()
config.read('in.ini',encoding='utf-8')#获取节点,列表形式
result = config.sections()
print(result)

3.2 读取节点下的键值

import configparserconfig = configparser.ConfigParser()
config.read('in.ini',encoding='utf-8')#该节点下的键值,返回的是列表里的元组
result = config.items('LogonInfo')
print(result)

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

import configparserconfig = configparser.ConfigParser()
config.read('in.ini',encoding='utf-8')result = config.get("UserConfig","WindowStyle")
print(result)

3.4 其他

import configparserconfig = 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_workbookwb = 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_workbookwb = 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_workbookwb = 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_workbookwb = 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 workbookwb = 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, GradientFillwb = 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  csvfn = 'cs.csv'
with open(fn) as csvFile: #打开csv文件csvReader = csv.reader(csvFile) #读文件建立Reader对象

2.2 读取CSV文件

import  csvfn = 'cs.csv'
with open(fn) as csvFile: #打开csv文件csvReader = csv.reader(csvFile) #读文件建立Reader对象listReport = list(csvReader) #将数据转换为列表print(listReport[0][1])#打印即可

 3.1.建立writer对象

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

3.2 写入CSV文件

import  csvfn = '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())#获取全部sheetsheet = book.sheet_by_index(0) #根据索引获取工作表sheet = book.sheet_by_name("Sheet1") #根据sheetname进行获取print(book.sheet_names())#获取所有工作表nameprint(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 xlwttitlestyle = 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.mzph.cn/pingmian/25527.shtml

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

相关文章

Spring运维之boo项目表现层测试匹配响应执行状态响应体JSON和响应头

匹配响应执行状态 我们创建了测试环境 而且发送了虚拟的请求 我们接下来要进行验证 验证请求和预期值是否匹配 MVC结果匹配器 匹配上了 匹配失败 package com.example.demo;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Auto…

Transformer动画讲解:Softmax函数

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。提前准备才是完全之策。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c…

读AI未来进行式笔记07量子计算

1. AI审讯技术 1.1. 发明者最初的目的是发明一种能够替代精神药物&#xff0c;为人类带来终极快乐的技术 1.1.1. 遗憾的是&#xff0c;他找到的只是通往反方向的大门 1.2. 通过非侵入式的神经电磁干扰大脑边缘系统&#xff0c;诱发受审者最…

VRRP基础配置(华为)

#交换设备 VRRP基础配置 VRRP (Virtual Router Redundancy Protocol) 全称是虚拟路由规元余协议&#xff0c;它是一种容错协议。该协议通过把几台路由设备联合组成一台虚拟的路由设备&#xff0c;该虚拟路由器在本地局域网拥有唯一的一个虚拟 ID 和虚拟 IP 地址。实际上&…

UV胶的均匀性对产品质量有什么影响吗?

UV胶的均匀性对产品质量有什么影响吗? UV胶的均匀性对产品质量具有显著的影响&#xff0c;主要体现在以下几个方面&#xff1a; 粘合强度&#xff1a;UV胶的均匀性直接影响其粘合强度。如果UV胶分布不均匀&#xff0c;可能导致部分区域粘接力不足&#xff0c;从而影响产品的…

报错:CMake Error OpenCVConfig.cmake opencv-config.cmake

1、编译过程中&#xff0c;出现OpenCV 报错问题 报错&#xff1a;CMake Error OpenCVConfig.cmake opencv-config.cmake 解决思路&#xff1a;参考此链接

LangChain + ChatGLM 实现本地知识库问答

基于LangChain ChatGLM 搭建融合本地知识的问答机器人 1 背景介绍 近半年以来&#xff0c;随着ChatGPT的火爆&#xff0c;使得LLM成为研究和应用的热点&#xff0c;但是市面上大部分LLM都存在一个共同的问题&#xff1a;模型都是基于过去的经验数据进行训练完成&#xff0c;无…

Python进阶-部署Flask项目(以TensorFlow图像识别项目WSGI方式启动为例)

本文详细介绍了如何通过WSGI方式部署一个基于TensorFlow图像识别的Flask项目。首先简要介绍了Flask框架的基本概念及其特点&#xff0c;其次详细阐述了Flask项目的部署流程&#xff0c;涵盖了服务器环境配置、Flask应用的创建与测试、WSGI服务器的安装与配置等内容。本文旨在帮…

JAVA-LeetCode 热题 100 第56.合并区间

思路&#xff1a; class Solution {public int[][] merge(int[][] intervals) {if(intervals.length < 1) return intervals;List<int[]> res new ArrayList<>();Arrays.sort(intervals, (o1,o2) -> o1[0] - o2[0]);for(int[] interval : intervals){if(res…

【嵌入式】波特率9600,发送8个字节需要多少时间,如何计算?

问题&#xff1a; 波特率9600&#xff0c;发送 01 03 00 00 00 04 44 09 (8字节) 需要多少时间&#xff0c;如何计算&#xff1f; 在计算发送数据的时间时&#xff0c;首先要考虑波特率以及每个字符的数据格式。对于波特率9600和标准的UART数据格式&#xff08;1个起始位&…

AIRNet模型使用与代码分析(All-In-One Image Restoration Network)

AIRNet提出了一种较为简易的pipeline&#xff0c;以单一网络结构应对多种任务需求&#xff08;不同类型&#xff0c;不同程度&#xff09;。但在效果上看&#xff0c;ALL-In-One是不如One-By-One的&#xff0c;且本文方法的亮点是batch内选择patch进行对比学习。在与sota对比上…

JAVA-学习-2

一、类 1、类的定义 把相似的对象划分了一个类。 类指的就是一种模板&#xff0c;定义了一种特定类型的所有对象的属性和行为 在一个.java的问题件中&#xff0c;可以有多个class&#xff0c;但是智能有一个class是用public的class。被声明的public的class&#xff0c;必须和文…

Pytorch 实现目标检测一(Pytorch 23)

一 目标检测和边界框 在图像分类任务中&#xff0c;我们假设图像中只有一个主要物体对象&#xff0c;我们只关注如何识别其类别。然而&#xff0c;很多时候图像里有多个我们感兴趣的目标&#xff0c;我们不仅想知 道它们的类别&#xff0c;还想得到它们在图像中的具体位置。在…

【前端】响应式布局笔记——自适应布局

自适应布局 自适应布局是不同设备对应不同的html(局部自适应)&#xff0c;通过判断设备的类型或控制局部的变化。 1、获取设备是移动端还是pc端 // 获取设备的信息let userAgent navigator.userAgent.toLowerCase();// 使用正则表达式来判断类型let device /ipad|iphone|m…

数据并非都是正态分布:三种常见的统计分布及其应用

你有没有过这样的经历&#xff1f;使用一款减肥app&#xff0c;通过它的图表来监控自己的体重变化&#xff0c;并预测何时能达到理想体重。这款app预测我需要八年时间才能恢复到大学时的体重&#xff0c;这种不切实际的预测是因为应用使用了简单的线性模型来进行体重预测。这个…

服务部署:.NET项目使用Docker构建镜像与部署

前提条件 安装Docker&#xff1a;确保你的Linux系统上已经安装了Docker。如果没有&#xff0c;请参考官方文档进行安装。 步骤一&#xff1a;准备项目文件 将你的.NET项目从Windows系统复制到Linux系统。你可以使用Git、SCP等工具来完成这个操作。如何是使用virtualbox虚拟电…

国产操作系统上给virtualbox中win7虚拟机安装增强工具 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上给virtualbox中win7虚拟机安装增强工具 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上给win7虚拟机安装virtualbox增强工具的文章。VirtualBox增强工具&#xff08;Guest Additions&a…

Liunx环境下redis主从集群搭建(保姆级教学)02

Redis在linux下的主从集群配置 本次演示使用三个节点实例一个主节点&#xff0c;两个从节点&#xff1a;7000端口&#xff08;主&#xff09;&#xff0c;7001端口&#xff08;从&#xff09;&#xff0c;7002端口&#xff08;从&#xff09;&#xff1b; 主节点负责写数据&a…

Rust-02-变量与可变性

在Rust中&#xff0c;变量和可变性是两个重要的概念。 变量&#xff1a;变量是用于存储数据的标识符。在Rust中&#xff0c;变量需要声明其类型&#xff0c;例如&#xff1a; let x: i32 5; // 声明一个名为x的变量&#xff0c;类型为i32&#xff08;整数&#xff09;&#…

安装MySQL Sample Database

本文安装的示例数据库为官方的Employees Sample Database。 操作过程参考其安装部分。 在安装前&#xff0c;MySQL已安装完成&#xff0c;环境为Linux。 克隆github项目&#xff1a; $ git clone https://github.com/datacharmer/test_db.git Cloning into test_db... remo…