标签:
float(word_dist)
得到一个文件对象(file object):open(filename, mode=‘r‘)
1. 模式mode:
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
使用r+打开文件后再seek(0)回到文件头进行写。
with open(filename, ‘r+‘) as file:
lines = file.read()
lines = re.sub(‘<configuration>.*</configuration>‘, s, lines, flags = re.S)
file.seek(0)
file.write(lines)
Windows平台下 :
如果以“文本”方式打开文件,当读取文件的时候,系统会将所有的"/r/n"转换成"/n";当写入文件的时候,系统会将"/n"转换成"/r/n"写入。
如果以"二进制"方式打开文件,则读/写都不会进行这样的转换。
在Unix/Linux平台下: “文本”与“二进制”模式没有区别。
lines may be terminated by any of the following: the Unix end-of-line convention ’\n’, the Macintosh convention ’\r’, or the Windows convention ’\r\n’. All of these external representations are seen as ’\n’ by the Python program.{12 Chapter 2. Built-in Functions The Python Library Reference, Release 2.6}
2 rU 或 Ua 以读方式打开, 同时提供通用换行符支持(PEP 278).
3 ‘w‘模式写入时文件不存在会自动创建,但目录不存在会报错:FileNotFoundError: [Errno 2] No such file or directory: ‘./doc_word_mat/AlarmClock_doc_word_mat_file.txt‘
if not exists(‘./doc_word_mat‘): makedir(‘./doc_word_mat‘) doc_word_mat_file = open(‘./doc_word_mat/file.txt‘, ‘w‘)
encoding is the name of the encoding used to decode or encode the file. This should only be used in text mode. The default encoding isplatform dependent, but any encoding supported by Python can bepassed.
默认方式与平台相关,如linux下可能默认是utf-8, windows下可能是gbk.
带BOM的utf-8编码的txt文件时开头会有一个多余的字符\ufeff,BOM被解码为一个字符\ufeff,如何去掉?
修改encoding为utf-8_sig或者utf_8_sig
a.py:
with open("***.txt", encoding=‘utf-8‘)as f
txt文件所在目录对应的是这个代码执行的目录(可能被另一个目录中的文件调用,则目录就是那个文件所在目录),而不是当前所在的文件a.py所在的目录。
所以这样打开文件有风险,可能***.txt和这行代码所在文件a.py在一个目录下,但是代码是在另一个目录(如b.py调用a.py中的函数)执行,这样就会出错:file not found error或者no file or directory named ***.txt
lz提供一个解决方案:
所有相对路径打开的文件改成这样的:
os.path.join(os.path.split(os.path.realpath(__file__))[0], filename)
这样就不会出错了,lz建议都这样写,因为在很多项目中py文件移来移去,虽然相对路径没变,但是py文件中的代码可以是被其它地方调用执行的,还是可能出错,lz遇到无数次了,所以如此建议~
f.read(size) 返回最多size个字节的str,当size缺省或为负值时,整个文件内容都被作为一个str读出来,若到文末,返回空串‘ ‘
f.readline() 返回文件中一行的str,末尾加上换行符‘\n‘
f.write(string) 将string写入file,返回成功写入的字符个数。
f.close() 文件对象使用完一定要close()掉。
f.seek(offset, from_what) 改变文件对象的位置(position),offset为偏移量,from_what为参考位置,为0时从文件开头, 为1时使用当前的文件位置,为2是使用文件末尾位置。from_what默认为0
例子:
1 按行从文件中读取,有一种简便的方式
1 f = open("print.py", "r+") 2 for line in f: #line的结尾会自动有一个“\n" 3 print(line, end=" ") #所以end=‘ ‘, 默认会又输出换行符
2 把print.py中的内容读出来,写到一个新文件中,在打印出来。
f = open("print.py", "r") f2 = open("wyfile", "w+") #使用w+文件不存在时候才会创建 for line in f: f2.write(line) f2.seek(0) #这行语句之前,f2的位置在文末,所以必须调整到文件开头。 print(f2.read(), end=‘ ‘) f.close() #记住要释放 f2.colse()
lines = linecache.getlines(r‘.\datasets\lastfm-dataset-1K\item_item_csr_mat.mtx‘)[2:-1] for l in lines: pass读取速度是前两个的N倍--///
s = time.time() lines = [line.split() for line in linecache.getlines(checkin_filename)] e = time.time() print(e - s) lines = np.loadtxt(checkin_filename, dtype=bytes).astype(str) s = time.time() print(s - e) lines = pd.read_csv(checkin_filename, sep=‘\t‘, header=None, parse_dates=[1]) e = time.time() print(e - s)11.72770071029663
python中的with的作用是自动释放对象,即使对象在使用的过程中有异常抛出。可以使用with的类型必须实现__enter__ __exit__。我的理解是=try...finally{},在finally中调用了释放函数。
[类似与CSharp中的using(){}关键字,用来自动确保调用对象的dispose()方法,即使对象有异常抛出。C#中可以使用using{}的对象必须已经实现了IDispose接口。]
def TestWith():with
statement is a useful when accessing anything that supports the context management protocol. Which meansopen()
for example. It basically makes sure that any set up and clean up code, such as closing files, is run without having to worry about it.2. 打开文件的优选最佳实践方式是使用前面的 “with” 语句。在 “with” 打开的代码块内,文件是打开的,而且可以自由读取。然而,一旦Python代码从 “with” 负责的代码段退出,文件会自动关闭。所以,通过使用 “with”,你避免了显式地关闭文件的操作。Python 会以一种不那么有 Python 风格的方式在幕后神奇而静静地替你关闭文件。
但是你不显式地关闭文件会怎样?如果你有点懒,既不使用 “with” 代码块也不调用f.close()怎么办?这时文件会什么时候关闭?f = open(‘/tmp/output‘, ‘w‘) f.write(‘abcn‘) f.write(‘defn‘) # check contents of /tmp/output (1) del(f) # check contents of /tmp/output (2) # exit from Python # check contents of /tmp/output (3)实验表明:
2. Python3 ,得到了相同的结果。移除对文件对象最后的引用后会导致文件被刷新并且被关闭。
3. PyPy 和 Jython下,得到了不同的结果!删除文件对象的引用后——也就是在阶段2,并没有导致文件内容被刷入磁盘。我不得不假设这和垃圾回收机制的不同或其他在 PyPy 和 CPython中工作机制的不同有关系。但是如果你在 PyPy中运行程序,就绝不要指望仅仅因为文件对象的引用结束,文件就会被刷新和关闭。命令 lsof 显示直到Python进程退出时文件才会被释放。也就是说,从 Python 退出确实会确保缓存中的数据写入磁盘。
换做是Python 3的话,情况就有些不同了。f.write执行后没有任何数据会写入。但是文件对象引用一旦结束,文件就会刷新并关闭。这可能是缓冲区很大的缘故。但毫无疑问,删除文件对象引用会使文件刷新并关闭。
5. 至于 PyPy 和 Jython,对大文件和小文件的操作结果都一样:文件在 PyPy 或 Jython 进程结束的时候刷新并关闭,而不是在文件对象的引用结束的时候。
import linecache
count = linecache.getline(filename,linenum)
str = linecache.getlines(filename) #str为列表形式,每一行为列表中的一个元素读取文件之后你不需要使用文件的缓存时需要在最后清理一下缓存,使linecache.clearcache()清理缓存,释放缓存。
这个模块是使用内存来缓存你的文件内容,所以需要耗费内存,打开文件的大小和打开速度和你的内存大小有关系。
【python计算文件的行数和读取某一行内容的实现方法】1 data = open(filename)
next(data) #或者data.readline()
for e in data:
print(e)
2 lines = f.readlines()[1:]
for l in lines:
print(l)
3. a=linecache.getlines(‘a.txt‘)[0:-1]
1. 获取a.txt文件中第1-4行的内容
>>> a=linecache.getlines(‘a.txt‘)[0:4]
2. lnum
=
0
with
open
(
‘pit.txt‘
,
‘r‘
) as fd:
for
line
in
fd:
lnum
+
=
1
;
if
(lnum >
=
10
) && (lnum <
=
13
):
print
line
fd.close()
最简单的办法是把文件读入一个大的列表中,然后统计列表的长度.如果文件的路径是以参数的形式filepath传递的,那么只用一行代码就可以完成我们的需求了:
count = len(open(filepath,‘rU‘).readlines())
如果是非常大的文件,上面的方法可能很慢,甚至失效.此时,可以使用循环来处理:
count = -1
for count, line in enumerate(open(thefilepath, ‘rU‘)):
count += 1
另外一种处理大文件比较快的方法是统计文件中换行符的个数‘\n ‘(或者包含‘\n‘的字串,如在windows系统中):
count = 0
thefile = open(thefilepath, ‘rb‘) #参数‘rb‘是必须的,否则在windows系统上,上面的代码会非常慢.
while True:
thefile.close( )
1. numpy.loadtxt()
2.使用numpy.genfromtxt
:
import numpy as np
np.genfromtxt(‘filename‘, dtype= None)
# array([(1, 2.0, ‘buckle_my_shoe‘), (3, 4.0, ‘margery_door‘)],
# dtype=[(‘f0‘, ‘<i4‘), (‘f1‘, ‘<f8‘), (‘f2‘, ‘|S14‘)])
df = DataFrame.from_csv(‘myfile.txt‘, sep=‘\t‘)
array = df.values # the array you are interested in
3.[python读入csv的三种方式]persontype = np.dtype({ ... ‘names‘:[‘name‘, ‘age‘, ‘weight‘, ‘height‘], ... ‘formats‘:[‘S32‘,‘i‘, ‘f‘, ‘f‘]})data = np.loadtxt(f, delimiter=",", dtype=persontype)
[文件存取]
fileinput模块可以对一个或多个文件中的内容进行迭代、遍历等操作。用fileinput对文件进行循环遍历,格式化输出,查找、替换等操作,非常方便。
Python的精髓在于模块的运用,运用C的思维,很难学好Python。fileinput模块可以轻松的遍历文本的所有行,可以实现类似pythonsome_script.py file_1.txt file_2.txtfile_2.txt的模式。
实际上就是一个readline(),只不过可以实现更多的功能
该模块的input()函数有点类似文件readlines()方法,区别在于:
前者是一个迭代对象,即每次只生成一行,需要用for循环迭代。后者是一次性读取所有行。在碰到大文件的读取时,前者无疑效率更高效。
【基本格式】
fileinput.input([files[, inplace[, backup[, bufsize[, mode[, openhook]]]]]])
【默认格式】
fileinput.input (files=None, inplace=False, backup=‘‘, bufsize=0, mode=‘r‘, openhook=None)
fileinput.input() #返回能够用于for循环遍历的对象
fileinput.filename() #返回当前文件的名称
fileinput.lineno() #返回当前已经读取的行的数量(或者序号)
fileinput.filelineno() #返回当前读取的行的行号
fileinput.isfirstline() #检查当前行是否是文件的第一行
fileinput.isstdin() #判断最后一行是否从stdin中读取
fileinput.close() #关闭队列
# C:\xxx\pyfunc\shut.py
# C:\xxx\pyfunc\test.py
标签:
原文地址:http://blog.csdn.net/pipisorry/article/details/37769669