python数据读写

python数据读写,包括文本文件、csv、excel、数据库等;

一、python 内置方法

open()函数

语法:open(filename,mode=‘r’,buffering=-1,…)

  1. mode可选参数,默认值为r。
  2. buffering也可选参数,默认值为-1(0代表不缓冲,1或者大于1的值表示缓冲一行或指定缓冲区大小)

mode参数:

r 以读模式打开(默认)
w 以写模式打开(清除原内容)
x 以写模式打开,若文件已存在则失败
a 以追加模式打开(从EOF开始,必要时创建新文件)
r+ 以读写模式打开
w+ 以读写模式打开(清空原内容)
a+ 以读和追加模式打开
rb 以二进制读模式打开
wb 以二进制写模式打开(参见w)
ab 以二进制追加模式打开(参见a)
rb+ 以二进制读写模式打开(参见r+)
wb+ 以二进制读写模式打开(参见w+)
ab+ 以二进制读写模式打开(参见a+)

返回值:

open()函数返回一个文件(file)对象
文件对象可迭代
有关闭和读写文件的相关函数/方法

读取/写入文件的两种写法:

# 方法一:普通写法
file1=open("文件地址","读写模式")
file1.write()/file1.read()...
file1.close

# 方法二:使用with关键字写法
with open("文件地址","读写模式") as 变量名:
	file1.write('')

使用 with open…as…: 格式要注意

冒号不能掉
对文件操作要缩进
无需用close()关闭

读取文件(read()、readline()、readlines())

方法描述
read()一次性读取整个文件内容。
readline()每次读取一行内容。内存不够时使用,一般不太用
readlines()一次性读取整个文件内容,并按行返回到list,方便我们遍历

read()

# 普通写法:
file1 = open('F:\\python_test\\scores.txt','r',encoding='utf-8')  # \在Python中是转义字符,所以时常会有冲突。为了避坑,Windows的绝对路径通常要稍作处理,写成以下两种格式; 'F:\\python_test\\scores.txt' 或者 r'F:\python_test\scores.txt'  
file_read = file1.read() 
file1.close()
print(file_read)  

# "with open...as...:"格式
with open('F:\\python_test\\scores.txt','r',encoding='utf-8') as f:
	file_read =f.read()
print(file_read)  

运行结果

罗恩 23 35 44
哈利 60 77 68 88 90
赫敏 97 99 89 91 95 99
马尔福 100 85 90

readlines()

readlines() 会从txt文件取得一个列表,列表中的每个字符串就是scores.txt中的每一行。而且每个字符串后面还有换行的\n符号。

# 普通写法:
file1 = open('F:\\python_test\\scores.txt','r',encoding='utf-8') 
file_lines = file1.readlines() 
file1.close()
print(file_lines)      

# "with open...as...:"格式
with open ('F:\\python_test\\scores.txt','r',encoding='utf-8') as f:
	file_lines = f.readlines()
print(file_lines)

运行结果

['罗恩 23 35 44\n', '哈利 60 77 68 88 90\n', '赫敏 97 99 89 91 95 99\n', '马尔福 100 85 90']

写入文件(write()、writelines())

方法描述
write()参数必须是字符串类型
writelines()参数可以是list(序列)类型

write()

如果打开文件模式中包含 w(写入),那么向文件中写入内容时,会先清空原文件中的内容,然后再写入新的内容。
如果你只想增加东西,而不想完全覆盖掉原文件的话,就要使用’a’模式,表示append。新写入的内容会添加到原内容后边。

# 普通写法:
file1 = open('F:\\python_test\\abc.txt','a',encoding='utf-8') 
file1.write('张无忌\n')     
file1.write('宋青书\n')     
file1.close()  

# "with open...as...:"格式
with open ('F:\\python_test\\abc.txt','a',encoding='utf-8') as f:
	f.write('张无忌\n')     
	f.write('宋青书\n') 

writelines()

# 普通写法:
file1 = open('F:\\python_test\\scores.txt','r',encoding='utf-8') 
file2 = open('F:\\python_test\\scores_writelines.txt','w+',encoding='utf-8')
file2.writelines(file1.readlines()) 
file1.close()
file2.close()

# "with open...as...:"格式
with open('F:\\python_test\\scores.txt','r',encoding='utf-8') as f1:
    file_read=f1.readlines()
    with open('F:\\python_test\\scores_writelines.txt','w+',encoding='utf-8') as f2: 
        file_write=f2.writelines(file_read)

注意: 使用 writelines() 函数向文件中写入多行数据时,不会自动给各行添加换行符。上面例子中,之所以 scores_writelines.txt 文件中会逐行显示数据,是因为 readlines() 函数在读取各行数据时,读入了行尾的换行符。

其他文件相关函数(fileObject.seek())

fileObject.seek(offset[,whence])

功能:在文件中移动文件指针,从whenc偏移offset个字节。

参数解析:
offset:开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
whence:参数可选,默认值为0。

  • 0:表示文件头部
  • 1:表示当前位置
  • 2:表示文件尾部
s = '奥利弗 45 67 78'
with open('F:\\python_test\\scores.txt','a+',encoding='utf-8') as f:
	f.writelines('\n')
	f.writelines(s)
	cNames = f.readlines()
print(cNames)

#输出:[]

运行上面的代码,我们可以发现程序结果并没有与我们预想一致,原因是读写文件时都是有一个文件指针,数据从文件指针开始读写,比如刚才我们通过writelines()进行数据写入,那此时文件指针已经在文件的尾部,这时再用readlines(),读出数据的时就会产生不正确的结果。
这时就可以用到文件指针函数seek(),如下所示。

s = '奥利弗 45 67 78'
with open('F:\\python_test\\scores.txt','a+',encoding='utf-8') as f:   
    f.writelines('\n')
    f.seek(0) #让文件指针回到文件开头
    f.writelines(s)
    cNames = f.readlines()
print(cNames)

#输出:['罗恩 23 35 44\n', '哈利 60 77 68 88 90\n', '赫敏 97 99 89 91 95 99\n', '马尔福 100 85 90\n', '奥利弗 45 67 78\n']

二、python模块(内置模块csv、外部模块openpyxl)

csv模块写入与读取

csv 写入文件步骤

1、创建文件:调用 open() 函数
2、创建对象:借助 writer() 函数
3、写入内容:调用 writer 对象的 writerow() 方法
4、关闭文件:close()

import csv #导入csv模块
csv_file = open('F:\\python_test\\demo.csv','w',newline='',encoding='utf-8') # 调用open()函数打开csv文件,传入参数:文件名“demo.csv”、写入模式“w”、newline=''、encoding='utf-8'。
writer = csv.writer(csv_file) # 用csv.writer()函数创建一个writer对象。
#writer.writerow('\ufeff')#解决使用excel打开时中文字符出现乱码情况
writer.writerow(['电影','豆瓣评分']) # 调用writer对象的writerow()方法,可以在csv文件里写入一行文字 “电影”和“豆瓣评分”。
writer.writerow(['银河护卫队','8.0'])
writer.writerow(['复仇者联盟','8.1'])
csv_file.close() # 写入完成后,关闭文件

csv 读取文件步骤

1、打开文件:调用open()函数
2、创建对象:借助reader()函数
3、读取内容:遍历reader对象
4、打印内容:print()

import csv
csv_file=open('F:\\python_test\\demo.csv','r',newline='',encoding='utf-8') #用open()打开“demo.csv”文件,'r'是read读取模式,newline=''是避免出现两倍行距。encoding='utf-8'能避免编码问题导致的报错或乱码
reader=csv.reader(csv_file) #用csv.reader()函数创建一个reader对象
for row in reader: #用for循环遍历reader对象的每一行。打印row,就能读取出“demo.csv”文件里的内容
    print(row)
csv_file.close()

在这里插入图片描述

模块openpyxl写入与读取

Excel文件写入步骤

1、创建工作薄:利用openpyxl.Workbook{}创建workbook对象
2、 获取工作表:借助workbook对象的active属性
3、操作单元格:单元格:sheet[‘A1’];一行:append()
4、保存工作薄:save{}

import openpyxl # 导入openpyxl   
wb=openpyxl.Workbook() # 利用openpyxl.Workbook()函数创建新的workbook(工作簿)对象,就是创建新的空的Excel文件。
sheet=wb.active # wb.active就是获取这个工作簿的活动表,通常就是第一个工作表。
sheet.title='册页一与一' # 可以用.title给工作表重命名。现在第一个工作表的名称就会由原来默认的“sheet1”改为"new title"。
sheet['A1'] = '吴青峰'  # 把'漫威宇宙'赋值给第一个工作表的A1单元格,就是往A1的单元格中写入了'漫威宇宙'。
rows = [['费洛蒙小姐','我会我会','最难的是相遇','低低星垂'],['宁静海','困在','迷幻','极光']] # 先把要写入的多行内容写成列表,再放进大列表里,赋值给rows。
for i in rows: # 遍历rows,同时把遍历的内容添加到表格里,这样就实现了多行写入。
    sheet.append(i)
print(rows)
wb.save('F:\\python_test\\song.xlsx') # 保存新建的Excel文件,并命名为“song.xlsx”

在这里插入图片描述

Excel文件读取步骤

1、打开工作薄:利用openpyxl.Workbook{}创建workbook对象
2、获取工作表:借助workbook对象的active属性
3、读取单元格:单元格:sheet[‘A1’];一行:append()
4、打印单元格:save{}

wb = openpyxl.load_workbook('F:\\python_test\\song.xlsx') #调用openpyxl.load_workbook()函数,打开“song.xlsx”文件。
sheet = wb['册页一与一']#获取“song.xlsx”工作簿中名为“册页一与一”的工作表。
sheetname = wb.sheetnames#sheetnames是用来获取工作簿所有工作表的名字的。
print(sheetname) #如果你不知道工作簿到底有几个工作表,就可以把工作表的名字都打印出来。
A1_cell = sheet['A1'] #把“册页一与一”工作表中A1单元格赋值给A1_cell,再利用单元格value属性,就能打印出A1单元格的值。
A1_value = A1_cell.value
print(A1_value)

运行结果
在这里插入图片描述

三、使用pandas库

写入文件(.csv、.excel、.txt等)

使用pandas写入文件方法如下 :

方法描述返回数据
to_csv()写入 .csv 格式 或者 .txt格式 文件输出dataframe格式
to_excel()写入excel文件(包括xlsx,xls,xlsm格式)输出dataframe格式

写入 .csv 文件:to_csv()

import pandas as pd
pd.to_csv() 是DataFrame类的方法

基本参数

DataFrame.to_csv(path_or_buf=None, sep=‘,’, na_rep=‘’, float_format=None, columns=None, header=True, index=True, index_label=None, mode=‘w’, encoding=None, compression=‘infer’, quoting=None, quotechar=‘"’, line_terminator=None, chunksize=None, date_format=None, doublequote=True, escapechar=None, decimal=‘.’, errors=‘strict’)

参数名称功能以及含义
path_or_buf文件输出路径
sep分隔符,默认为’,’
na_rep缺失数据填充,默认是空字符串;na_rep=“NULL”:空值保存为NULL
float_format字符串格式,小数点保留几位
columns要输出到csv的列名
header是否保留列名,默认是保留列名,可传入一个列名列表list
index写行名称(索引),默认写入;index=False:不显示行名
encoding编码格式,表示在输出文件中使用的编码的字符串,Python2默认为“ASCII”,Python3默认为“UTF-8”。
#任意的多组列表
a = [1,2,3]
b = [4,5,6]    

#字典中的key值即为csv中列名
dataframe = pd.DataFrame({'a_name':a,'b_name':b})

#将DataFrame存储为csv,index表示是否显示行名
dataframe.to_csv("F:\\python_test\\test.csv",index=False,sep=',')

在这里插入图片描述

data.to_csv(data_write_path,float_format='%.2f',encoding='utf=8-sig') #保留两位小数
data.to_csv(data_write_path,columns=['电影'],encoding='utf=8-sig') #只保留名为“电影”这一列
data.to_csv(data_write_path,header=0,encoding='utf=8-sig')  #不保存列名
data.to_csv(data_write_path,index=0,encoding='utf=8-sig')   #不保存行索引
写入 .txt 文件:to_csv()

import pandas as pd
pd.to_csv()
记得一定设置分割方式:sep

import pandas as pd
data_read_path='F:\\python_test\\demo.csv'
data=pd.read_csv(data_read_path)
data.to_csv('F:\\python_test\\demo_save.txt', sep='\t', index=False)

在这里插入图片描述

写入 .excel 文件:to_excel()

import pandas as pd
pd.to_excel()

基本参数

DataFrame.to_excel(excel_writer, sheet_name=‘Sheet1’, na_rep=‘’, float_format=None, columns=None,
header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True,
encoding=None, inf_rep=‘inf’, verbose=True, freeze_panes=None)

参数名称功能以及含义
excel_writer文件路径或现有的ExcelWriter
sheet_name它是指包含DataFrame的工作表的名称。

其他参数意义和to_csv()相似,可以参考前面to_csv()例子。

单个sheet写入
import pandas as pd
 
df1 = pd.DataFrame({'One': [1, 2, 3]})
df1.to_excel('F:\\python_test\\excel1.xlsx', sheet_name='test1', index=False) # index false为不写入索引

在这里插入图片描述

读取文件(.csv、.excel、.txt等)

使用pandas读取文件方法如下 :

方法描述返回数据
read_csv()读取csv格式文件输出dataframe格式
read_excel()读取excel文件(包括xlsx,xls,xlsm格式)输出dataframe格式
read_table()读取txt文件,通过sep参数(分隔符)的控制来对任何文本文件读取
read_json()读取json格式文件
read_html()读取html表格
read_clipboard()读取剪切板内容
read_pickle()读取pickled持久化文件
read_sql()读取数据库数据,连接好数据库后,传入sql语句即可。
read_dhf()读取hdf5文件,适合大文件读取。
read_parquet()读取parquet文件
read_sas()读取sas文件
read_stata()读取stata文件
read_gdp()读取google_blgquery数据
读取 .csv 文件:read_csv()

pandas.read_csv(filepath_or_buffer, sep=, delimiter=None, header=‘infer’, names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, cache_dates=True, iterator=False, chunksize=None, compression=‘infer’, thousands=None, decimal=’.’, lineterminator=None, quotechar=’"’, quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, dialect=None, error_bad_lines=True, warn_bad_lines=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None, storage_options=None)

基本参数
参数名称功能以及含义
filepath_or_buffer可以是文件路径、可以是URL,也可以是实现read方法的任意对象。
sep字符串,表示分隔符,默认为’,’ .。
delimiter分隔符的另一个名字,与sep功能相似,默认None。
delim_whitespace默认为False,设置为True时,表示分隔符这空白字符,可以是空格,‘\t’等等。不管分隔符是什么,只要是空白字符,那么可以通过delim_whitespace=True进行读取。delim_whitespace=True
header设置导入DataFrame的列名称,默认为”infer“,注意它与下面介绍的names参数的微妙关系。header=1:指定header为1,则选取第二行当做表头,第二行下面为数据
names当names没被赋值时,header=0,即选取数据文件的第一行作为列名;当names被赋值,header没被赋值时,header=None。如果都赋值,就会实现两个参数的组合功能。names=[‘id’,‘movies’,‘grades’,‘date’]
index_col读取文件之后得到的DataFrame的索引默认是0,1,2…,我们可以通过set_index设定索引,但是也可以在读取的时候就指定某列为索引,如index_col="电影"表示指定“电源”这一列为索引列。
usecols如果一个数据集中含有很多列,但是我们在读取的进修只想要使用到的列,就可以使用这个参数。如:usecols=[“电影”]表示仅读取“电源”这一列
mangle_dupe_cols在实际工作中,我们得到的数据会很复杂,有时导入的数据会含有名字相同的列。参数 mangle_dupe_cols 会将重名的列后面多一个 .1,该参数默认为 True,如果设置为 False,会抛出不支持的异常。
prefix当导入的数据没有header时,设置此参数会自动加一个前缀,如: prefix=“hello”,列名为:hello0,hello1,hello2.。。。。。
header、names

1、 csv文件有表头并且是第一行,那么names和header都无需指定;
2、csv文件有表头、但表头不是第一行,可能从下面几行开始才是真正的表头和数据,这个时候指定header即可;
3、csv文件没有表头,全部是纯数据,那么我们可以通过names手动生成表头;
4、csv文件有表头、但是这个表头你不想用,这个时候同时指定names和header。先用header选出表头和数据,然后再用names将表头替换掉,就等价于将数据读取进来之后再对列名进行rename;

#header=0,即选取文件的第一行作为表头
pd.read_csv(data_path,sep=',')
#不指定names,指定header为1,则选取第二行当做表头,第二行下面为数据。
pd.read_csv(data_path,sep=',',header=1)
pd.read_csv(data_path,sep=',',names=['id','movies','grades','date'])
#相当于先不看names,只看header,header为0代表先把第一行当做表头,下面的当成数据;然后再把表头用names给替换掉。
pd.read_csv(data_path,sep=',',names=['id','movies','grades','date'],header=0)

最后一个结果:
在这里插入图片描述

index_col

index_col:我们在读取文件之后所得到的DataFrame的索引默认是0、1、2……,我们可以通过set_index设定索引,但是也可以在读取的时候就指定某列为索引。

pd.read_csv(data_path,sep=',',index_col="电影")

在这里插入图片描述

usecols

如果一个数据集中有很多列,但是我们在读取的时候只想要使用到的列,我们就可以使用这个参数。

pd.read_csv(data_path,sep=',',usecols=["电影"])

在这里插入图片描述

通用解析参数
参数名称功能以及含义
dtype在读取数据的时候,设定字段的类型。
enginepandas解析数据时用的引擎,目前解析引擎有两种:c、python。默认为 c,因为 c 引擎解析速度更快,但是特性没有 python 引擎全。如果使用 c 引擎没有的特性时,会自动退化为 python 引擎。
converters读取数据的时候对列数据进行变换。
skiprows表示过滤行,想过滤哪些行,就写在一个列表里面传递给skiprows即可。注意的是:这里是先过滤,然后再确定表头。skiprows=[0]:这里把第一行过滤掉了,因为第一行是表头,所以在过滤掉之后第二行就变成表头了。
skipfooter从文件末尾未过滤行。skipfooter=3:过滤末尾的3行
nrows设置一次性读入的文件行数。如:nrows=1
comment指定注释符,在读取数据时,如果碰到行首指定的注释符,则跳过该行。

例如,编号为“0002”,如果默认读取的时候,会显示为2,所以这个时候要把他转为字符串类型,才能正常显示为0002:

pd.read_csv(data_path,sep=',',dtype={"编号": str})

在这里插入图片描述

pd.read_csv(data_path, sep=",", skiprows=lambda x:x>0 and x%2 == 0) #由于索引从0开始,所以凡是索引大于0、并且%2等于0的记录都过滤掉。索引大于0,是为了保证表头不被过滤掉。

在这里插入图片描述
nrows:设置一次性读入的文件行数。

na_values

该参数可以配置哪些值需要处理成NaN

pd.read_csv(data_path, sep=",",  na_values={"电影": ["银河护卫队", "复仇者联盟"]})

在这里插入图片描述

时间处理相关参数
参数名称功能以及含义
parse_dates指定某些列为时间类型,这个参数一般搭配date_parse使用。
date_parser用来配合parse_dates参数的,因为有的列虽然是日期,但没办法直接转化,需要我们指定一个解析格式。
infer_datetime_format参数默认为 False。如果设定为 True 并且 parse_dates 可用,那么 pandas 将尝试转换为日期类型,如果可以转换,转换方法并解析,在某些情况下会快 5~10 倍。
from datetime import datetime
data_1=pd.read_csv(data_path,sep=',')
data_2=pd.read_csv(data_path, sep=",",  parse_dates=["日期"], date_parser=lambda x: datetime.strptime(x, "%Y-%m-%d"))
读取 .excel 文件:read_excel()

pandas.read_excel(io,sheet_name=0,
header=0,names=None,index_col=None,usecols=None,squeeze=False,dtype=None,engine=None,converters=None,true_values=None,false_values=None,skiprows=None,nrows=None,na_values=None,keep_default_na=True,verbose=False,parse_dates=False,date_parser=None,thousands=None,comment=None,skipfooter=0,convert_float=True,mangle_dupe_cols=True,**kwds)

io:支持str,bytes,ExcelFile, xlrd.Book, path object, or file-like object。
默认读取第一个sheet的全部数据

sheet_name():参数支持str,int,list,None,default()格式,
str字符串用于引用的sheet的名称,如:pd.read_excel(excel_path,sheet_name=“无与伦比的美丽”);
int整数用于引用的sheet的索引(从0开始),如:pd.read_excel(excel_path,sheet_name=2,names=[“song”],header=None)

读取 .txt 文件:read_table()

pandas.read_table(filepath_or_buffer, *, sep=_NoDefault.no_default, delimiter=None, header=‘infer’, names=_NoDefault.no_default, index_col=None, usecols=None, squeeze=None, prefix=_NoDefault.no_default, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, cache_dates=True, iterator=False, chunksize=None, compression=‘infer’, thousands=None, decimal=‘.’, lineterminator=None, quotechar=‘"’, quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, encoding_errors=‘strict’, dialect=None, error_bad_lines=None, warn_bad_lines=None, on_bad_lines=None, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None, storage_options=None)

有一个test.txt文件,内容如下:
在这里插入图片描述

import pandas as pd
#用read_table函数读取文本文件的数据
data=pd.read_table('F:\\python_test\\test.txt', #文件路径,前面的filepath_or_buffer符可以省略掉       
         sep=',',#指定数据中变量之间的分隔符,注意这里是中文的逗号  
         header=None , #不需要将原来的数据中的第一行读作表头
         names=['id','name','gender','native place'] , #重新为各列起变量名称
         converters={'id':str} ,#将ID转换为字符串,以免开头的00消失
         skiprows=2 , #跳过开头的两行数据
         skipfooter=2, #跳过末尾的两行数据
         comment='!', #不读取“!”开头的数据行
         engine='python',#skipfooter:从文件末尾过滤行,解析引擎退化为 Python,C 解析引擎没有这个特性。
         encoding='utf-8' #为防止中文乱码
         )

运行结果
在这里插入图片描述

三、使用numpy库

写入文件(savetxt()、save()、savez())

Numpy写入文件的3中方法:savetxt()、save()、savez()。

方法描述返回数据
savetxt()将1维或者2维数组写入txt文本或csv文件数组
save()写Numpy专用的二进制数据,将数组以未压缩二进制格式保存在扩展名为.npy的文件中。会自动处理元素类型和形状等信息。
savez()写Numpy专用的二进制格式文件。将多个数组压缩到一个扩展名为npz的文件。其中每个文件都是一个save()保存的npy文件。数据

savetxt()

numpy.savetxt(fname,array,fmt=‘%.18e’,delimiter=None,newline=‘\n’, header=‘’, footer=‘’, comments='# ', encoding=None)**

主要参数
参数名称功能以及含义
fname文件、字符串或产生器,可以是.gz或.bz2的压缩文件。
array存入文件的数组(一维数组或者二维数组)
fmt写入文件的格式,如%d , %.2f , %.18e,默认值是%.18e(浮点数)。
delimiter分隔符,通常情况是str可选。
header将在文件开关写入的字符串。
footer将在文件尾部写入的字符串。
comments将附加到header和footer字符串的字符串,以将其标记为注释。默认值:’#’
encodiing用于编码输出文件的编码。

写入 .txt 文件

import numpy as np
arr=np.arrange(12).reshape(3,4)

## 保存为txt文件,fmt缺省取%.18e(浮点数),分割符默认是空格。
np.savetxt("F:\\python_test\\numpy_test_1.txt",arr)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值