目录
在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
1.读文件
要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符:
f = open('test.txt', 'r')
标示符'r'表示以只读方式打开文件,这样,我们就成功地打开了一个文件。
如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在
如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示:
f.read()
最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:
f.close()
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:
try:
f = open('test.txt', 'r')
print(f.read())
finally:
if f:
f.close()
但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:
with open('test.txt', 'r') as f:
print(f.read())
这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。
python文件对象提供了三个“读”方法: read()、readline() 和 readlines()。每种方法可以接受一个变量以限制每次读取的数据量。
- read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果文件有10G,内存就爆了,为了保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。
- readlines() 一次读取整个文件并返回list,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。
- readline() 每次只读取一行,通常比readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 readline()。
如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:
注意:这三种方法是把每行末尾的'\n'也读进来了,它并不会默认的把'\n'去掉,需要我们手动去掉。
文件:
代码:
with open('test.txt', 'r') as f:
print(f.readlines())
输出:
去掉'\n'
with open('test.txt', 'r') as f:
list = f.readlines()
for i in range(0, len(list)):
#rstrip() 删除 string 字符串末尾的指定字符(默认为空格)
list[i] = list[i].rstrip('\n')
print(list)
2.关于open()的mode参数:
r':读
'w':写
'a':追加
'r+' == r+w(可读可写,文件若不存在就报错(IOError))
'w+' == w+r(可读可写,文件若不存在就创建)
'a+' ==a+r(可追加可写,文件若不存在就创建)
对应的,如果是二进制文件,就都加一个b就好啦:
'rb' 'wb' 'ab' 'rb+' 'wb+' 'ab+'
3.例子:
文件格式如下:
#文件格式如下
#时间 特大买单成交量(股) 大买单成交量(股) 中买单成交量(股) 小买单成交量(股) 特大卖单成交量(股) 大卖单成交量(股) 中卖单成交量(股) 小卖单成交量(股) 特大买单成交金额(*100) 大买单成交金额(*100) 中买单成交金额(*100) 小买单成交金额(*100) 特大卖单成交金额(*100) 大卖单成交金额(*100) 中卖单成交金额(*100) 小卖单成交金额(*100) 资金净流入(*100)
20200902 318516220 219740191 202442598 145346084 525567573 367242618 286306137 192043867 334783321430 221143426700 160455962436 94602339494 433776177276 301239190208 204832110249 120639938104 -249591318637
20200903 223312188 199410993 178719377 152127174 341225007 281349829 250664639 186214027 231780516957 199556114436 144084298648 100417175597 293348257021 241912577341 179113193617 116545293491 -156289060416
20200904 232393823 185595779 191135633 170489180 320735346 203114740 188915495 147991632 186928489504 163257126820 143409004929 109248071467 252977430459 175582715437 144615333670 97767150603 -68574891049
20200907 268545057 210126606 175338439 160350584 282467031 256370214 209320202 166267010 244222191516 208504707046 140276526820 104468907865 237108717183 229211911056 161352502634 106400173585 -36738709111
split() 通过指定分隔符对字符串进行分割,返回值为分割后的字符串列表
float() 函数用于将整数和字符串转换成浮点数
int() 函数用于将一个字符串或数字转换为整型
def MakeVol (fVal):
strVal = '---'
strWan = '万'
strYi = '亿'
NUM_WAM = 10000
NUM_YI = 100000000
NUM_WAN_YI = 1000000000000
if abs(fVal) < NUM_WAM:
strVal = '{:.2f}'.format(fVal)
elif abs(fVal) < NUM_YI:
strVal = '{:.2f}{}'.format(fVal / NUM_WAM, strWan)
elif abs(fVal) < NUM_WAN_YI:
strVal = '{:.2f}{}'.format(fVal / NUM_YI, strYi)
else:
strVal = '{:.2f}{}{}'.format(fVal / NUM_WAN_YI, strWan, strYi)
print(strVal)
#时间 特大买单成交量(股) 大买单成交量(股) 中买单成交量(股) 小买单成交量(股) 特大卖单成交量(股) 大卖单成交量(股) 中卖单成交量(股) 小卖单成交量(股) 特大买单成交金额(*100) 大买单成交金额(*100) 中买单成交金额(*100) 小买单成交金额(*100) 特大卖单成交金额(*100) 大卖单成交金额(*100) 中卖单成交金额(*100) 小卖单成交金额(*100) 资金净流入(*100)
#一、解析文件并将数据加载到内存中
#1.读取文件到mfList中
with open('stat_day_800881126.txt', 'r') as file:
mfList = file.readlines()
#2.对文件进行解析,并将数据放入mfDict中
#key:日期 value:list[[0,1,2,3,4,5],[0,1,2,3,4,5]] list[0]主力资金列表:1 2 3 5 10 20日资金数据,list[1]资金列表。
mfDict = {}
for i in range(0, len(mfList)):
#去掉每行中的换行符\n
mfList[i] = mfList[i].rstrip('\n')
#对每行中的数据根据\t分割后放入mfListItem List中,并将其替换到mfList中
mfListItem = mfList[i].split('\t')
mfList[i] = mfListItem
#mfListItem的首个字段是日期
strDate = mfListItem[0]
dayNumMfList = []
dayNumMainMfItemList = []
dayNumMfItemList = []
dayNum = 0
NetInflowSum = 0.0
MainNetInflowSum = 0.0
while dayNum < 20:
if (i - dayNum) >= 0:
dateMf = mfList[i - dayNum]
MainNetInflow = 0.0
NetInflow = 0.0
#主力资金净流入
MainNetInflow = (float(dateMf[9]) + float(dateMf[10]) - float(dateMf[13]) - float(dateMf[14]))/100
#资金净流入
NetInflow = (float(dateMf[9]) + float(dateMf[10]) + float(dateMf[11]) + float(dateMf[12]) - float(dateMf[13]) - float(dateMf[14]) - float(dateMf[15]) - float(dateMf[16]))/100
#dayNum+1日主力资金净流入
MainNetInflowSum = MainNetInflowSum + MainNetInflow
#dayNum+1日资金净流入
NetInflowSum = NetInflowSum + NetInflow
if (dayNum + 1) in [1, 2, 3, 5, 10, 20]:
dayNumMainMfItemList.append(MainNetInflowSum)
dayNumMfItemList.append(NetInflowSum)
dayNum = dayNum + 1
dayNumMfList.append(dayNumMainMfItemList)
dayNumMfList.append(dayNumMfItemList)
mfDict[strDate] = dayNumMfList
print(mfDict)
#二、从内存中查找所需数据
dayNumDic = {'1': 0, '2': 1, '3': 2, '5': 3, '10': 4, '20': 5}
while (1):
strInput = input('input:"date,dayNum(1,2,3,5,10,20),type(1:block,2:stock)",exmple:"20210113,20,1" input 0 to exit:\n')
if(strInput == '0'):
break
strList = strInput.split(',')
if strList.__len__() < 3:
print('invalid input!')
continue
#日期
date = strList[0]
#n日资金数据
mfDayNum = strList[1]
#type=1,板块数据;type=2,个股数据。
type = strList[2]
if (type in ['1', '2']) and (mfDayNum in ['1', '2', '3', '5', '10', '20']):
if mfDict.__contains__(date):
nNetInflow = 0.0
dateMfData = mfDict[date][int(type) - 1]
print(dateMfData)
if len(dateMfData) > dayNumDic[mfDayNum]:
nNetInflow = dateMfData[dayNumDic[mfDayNum]]
print("net_inflow:", nNetInflow)
MakeVol(nNetInflow)
else:
print('no data')
else:
print("not find this date.")
else:
print("invalid input")
参考:
https://www.cnblogs.com/zywscq/p/5441145.html python文件读写小结
https://www.liaoxuefeng.com/wiki/1016959663602400/1017607179232640 文件读写