读写字符串或文本文件中的数据

jerry Python 2015年11月23日 收藏

用python和numpy处理数据次数比较多,写了几个小函数,可以方便地读写数据:

  1. # -*- coding: utf-8 -*-
  2. #----------------------------------------------------------------------
  3. # FileName:gettxtdata.py
  4. #功能:读取字符串和文件中的数值数据(浮点数)
  5. #主要提供类似matlab中的dlmread和dlmwrite函数
  6. #同时提供loadtxtdata和savetxtdata函数
  7. #Data: 2013-1-10
  8. #Author:吴徐平
  9. #----------------------------------------------------------------------
  10. import numpy
  11. #----------------------------------------------------------------------
  12. def StringToDoubleArray(String):
  13. """
  14. #将字符串中的所有非Double类型的字符全部替换成空格
  15. #以'#'开头注释直至行尾,都被清空
  16. #返回一维numpy.array数组
  17.  
  18. """
  19. from StringIO import StringIO
  20. import re
  21. DataArray=numpy.empty([0],numpy.float64)
  22.  
  23. if len(String.strip())>0:
  24. #清空注释行,都是以'#'开头子字符
  25. doublestring=re.sub('#.*$', " ", String, count=0, flags=re.IGNORECASE)
  26. #删除非数字字符
  27. doublestring=re.sub('[^0-9.e+-]', " ", doublestring, count=0, flags=re.IGNORECASE)
  28. #去掉不正确的数字格式(代码重复是有必要的)
  29. doublestring=re.sub('[.e+-](?=\s)', " ", doublestring, count=0, flags=re.IGNORECASE)
  30. doublestring=re.sub('[.e+-](?=\s)', " ", doublestring, count=0, flags=re.IGNORECASE)
  31. doublestring=re.sub('[e+-]$', " ", doublestring, count=0, flags=re.IGNORECASE)
  32. doublestring=re.sub('[e+-]$', " ", doublestring, count=0, flags=re.IGNORECASE)
  33. #去掉首尾空格
  34. doublestring=doublestring.strip()
  35. if len(doublestring)>0:
  36. StrIOds=StringIO(doublestring)
  37. DataArray= numpy.genfromtxt(StrIOds)
  38. return DataArray
  39.  
  40. #----------------------------------------------------------------------
  41. def GetDoubleListFromString(String):
  42. """
  43. #使用换行符分割字符串
  44. #将字符串中的所有非Double类型的字符全部替换成空格
  45. #以'#'开头注释直至行尾,都被清空
  46. #将每一行转换成numpy.array数组
  47. #返回numpy.array数组的列表
  48.  
  49. """
  50. from StringIO import StringIO
  51. import re
  52. DoubleList=[]
  53. StringList=String.split('\n')#使用换行符分割字符串
  54. for Line in StringList:
  55. if len(Line.strip())>0:
  56. #清空注释行,都是以'#'开头子字符
  57. doublestring=re.sub('#.*$', " ", Line, count=0, flags=re.IGNORECASE)
  58. #删除非数字字符
  59. doublestring=re.sub('[^0-9.e+-]', " ", doublestring, count=0, flags=re.IGNORECASE)
  60. #去掉不正确的数字格式(代码重复是有必要的)
  61. doublestring=re.sub('[.e+-](?=\s)', " ", doublestring, count=0, flags=re.IGNORECASE)
  62. doublestring=re.sub('[.e+-](?=\s)', " ", doublestring, count=0, flags=re.IGNORECASE)
  63. doublestring=re.sub('[e+-]$', " ", doublestring, count=0, flags=re.IGNORECASE)
  64. doublestring=re.sub('[e+-]$', " ", doublestring, count=0, flags=re.IGNORECASE)
  65. #去掉首尾空格
  66. doublestring=doublestring.strip()
  67. if len(doublestring)>0:
  68. StrIOds=StringIO(doublestring)
  69. DoubleList.append(numpy.genfromtxt(StrIOds))
  70. return DoubleList
  71. #----------------------------------------------------------------------
  72. def GetDoubleListFromFile(FileName):
  73. """
  74. #将文本文件中的所有Double类型的字符全部替换成numpy.array数组
  75. #每一行都是numpy.array数组
  76. ##返回numpy.array数组的列表
  77. #注意:返回列表的每个元素又都是一个numpy.array数组
  78. #注意:返回列表的每个元素(或文件每行)可以包含不同多个数的数字
  79.  
  80. """
  81. file=open(FileName, 'r')
  82. read_file = file.read()
  83. file.close()
  84. DoubleList=GetDoubleListFromString(read_file)
  85. return DoubleList
  86.  
  87. def dlmread(FileName,dtype=numpy.float64):
  88. """
  89. #Load Data From Txt-File.
  90. #分隔符默认是:";",",",空格类 (包括\t)等等
  91. #以#开头的被认为是注释,不会被读取
  92. #Return Value:二维数值数组(numpy.ndarray)
  93. #对文本中数据的排列格式要求最低,且容许出现注释字符,智能化程度最高,但速度较慢
  94. """
  95. DoubleList=GetDoubleListFromFile(FileName)
  96. dlsize=[]#每一行数组的大小
  97. for dL in DoubleList:
  98. dlsize.append(dL.size)
  99. MinColumnSize=min(dlsize)#数组的最大列数
  100. MaxColumnSize=max(dlsize)#数组的最小列数
  101. #数组创建和赋值
  102. DoubleArray=numpy.empty([len(DoubleList),MinColumnSize],dtype=dtype)
  103. row=range(0,len(DoubleList))
  104. colum=range(0,MinColumnSize)
  105. for i in row:
  106. for j in colum:
  107. DoubleArray[i][j]=DoubleList[i][j]
  108. return DoubleArray
  109. #----------------------------------------------------------------------
  110.  
  111. def loadtxtdata(filename,delimiter=""):
  112. """
  113. #Load Data From Txt-File with delimiter.
  114. #分隔符默认是:";",",",空格类 (包括\t)和自定义的delimiter等
  115. #Return Value: 二维数值数组(numpy.ndarray)
  116. #对文本中数据的排列格式要求较高,且不容许出现注释字符,智能化程度较低,但速度较快
  117. """
  118. from StringIO import StringIO
  119. import re
  120. file_handle=open(filename,'r')
  121. LinesALL=file_handle.read()#读入字符串
  122. file_handle.close()
  123. DelimiterALL=delimiter+",;"#分隔符
  124. SpaceString=" "#空格
  125. for RChar in DelimiterALL:
  126. LinesALL=LinesALL.replace(RChar,SpaceString)
  127. return numpy.genfromtxt(StringIO(LinesALL))
  128. #----------------------------------------------------------------------
  129. def savetxtdata(filename, X, fmt='%.8e', delimiter=' ', newline='\n'):
  130. """
  131. Save Data To Txt-File.
  132. """
  133. numpy.savetxt(filename, X, fmt=fmt, delimiter=delimiter, newline=newline)
  134. return True
  135. #----------------------------------------------------------------------
  136. def dlmwrite(filename, X, fmt='%.8e', delimiter=' ', newline='\n'):
  137. """
  138. Save Data To Txt-File.
  139. """
  140. numpy.savetxt(filename, X, fmt=fmt, delimiter=delimiter, newline=newline)
  141. return True
  142. #----------------------------------------------------------------------
  143. #测试程序
  144. #----------------------------------------------------------------------
  145. if __name__ == '__main__':
  146. #生成随机数
  147. data=numpy.random.randn(3,4)
  148. filename='D:/x.txt'
  149. #写入文件
  150. dlmwrite(filename,data)
  151. x=GetDoubleListFromFile(filename)
  152. print(x)
  153. print(dlmread(filename))
  154. y=StringToDoubleArray('79l890joj')
  155. print(y)
  156. z=loadtxtdata(filename)
  157. print(z)

我只在python2.7中试过,如果要在python3.x中使用,可自行测试.