不同编程语言中文件存取相关操作
2017-11-04 19:23
162 查看
当在不同语言间切换的时候,对一些相似操作容易产生混淆。在这里记录下不同语言中文件读取的区别,这篇文章始终不会写完,我偶尔碰到一点就记录一点。
你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。
语法:
例如:fo = open(“XXX.txt”, “r+”)
各个参数的细节如下:
不同模式打开文件的完全列表:
file(name[, mode[, buffering]])
file()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。
mode是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个\n,而在windows中是‘\r\n’,用U模式打开文件,就是支持所有的换行模式,也就说‘\r’ ‘\n’ ‘\r\n’都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。
buffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。
file对象有自己的属性和方法。
利用file对象的属性可以对实现对文件的操作主要有:获取文件相关信息、读文件(获取内容)、写文件、关闭file对象
以下是和file对象相关的属性列表:
注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。
更简洁的方式
自动帮我们调用close()方法
的错误,可以如此操作,fo=open(“Python读写文件.txt”,’r’,,encoding=’UTF-8’);但是以这种用realines读入时,文件数据开头有“\ufeff”,原因如下:
在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识。
更详细可参考
这个标识在python和Java读取文件的时候,不会被去掉。如果用readLine()读取第一行存进String里面,这个String的length会比看到的大1,而且第一个字符就是这个BOM。
好在python会统一把BOM变成“\ufeff”,这样的话,就可以自己手动解决了(判断后,用substring()或replace()去除掉这个BOM):
Read a text file from HDFS, a local file system (available on all nodes), or any Hadoop-supported file system URI, and return it as an RDD of Strings.
If use_unicode is False, the strings will be kept as str (encoding as utf-8), which is faster and smaller than unicode. (Added in Spark 1.2)
wholeTextFiles(path, minPartitions=None, use_unicode=True)[source]
Read a directory of text files from HDFS, a local file system (available on all nodes), or any Hadoop-supported file system URI. Each file is read as a single record and returned in a key-value pair, where the key is the path of each file, the value is the content of each file.
If use_unicode is False, the strings will be kept as str (encoding as utf-8), which is faster and smaller than unicode. (Added in Spark 1.2)
Spark SQL中读取文件和获取数据
来源,以下的spark均表示已存在的SparkSession
spark.read.json
spark.read.load
spark.read.parquet
JDBC To Other Databases
1、Python中文件操作
在输入文件路径时,注意文件名前是双斜杠,如’D:\tobacco\dataformat\orginal\’1.1 获取文件操作权限
Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作。你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。
语法:
file object = open(file_name [, access_mode][, buffering])
例如:fo = open(“XXX.txt”, “r+”)
各个参数的细节如下:
file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。 access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。 buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行;如果将buffering的值设为大于1的整数,这就是寄存区的缓冲大小;如果取负值,寄存区的缓冲大小则为系统默认。
不同模式打开文件的完全列表:
模式 | 描述 | 例子 |
---|---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 | 读文本文件;input = open(‘data’, ‘r’);第二个参数默认为r input = open(‘data’); |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 | 读二进制文件:input = open(‘data’, ‘rb’) |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 | |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 | |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 | output = open(‘data’, ‘w’) |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 | output = open(‘data’, ‘wb’) |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 | output = open(‘data’, ‘w+’) |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 | |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 | |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 | |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 | |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
读取所有内容 file_object = open('thefile.txt') try: all_the_text = file_object.read( ) finally: file_object.close( ) 读固定字节 file_object = open('abinfile', 'rb') try: while True: chunk = file_object.read(100) if not chunk: break do_something_with(chunk) finally: file_object.close( ) 读每行 list_of_all_the_lines = file_object.readlines( ) 如果文件是文本文件,还可以直接遍历文件对象获取每行: for line in file_object: process line
写数据 file_object = open('thefile.txt', 'w') file_object.write(all_the_text) file_object.close( ) 写入多行 file_object.writelines(list_of_text_strings) 注意,调用writelines写入多行在性能上会比使用write一次性写入要高。 在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为 2GB 的机器上处理一个 2GB 的日志文件,我们可能希望每次只处理其中 200MB 的内容。 在 Python 中,内置的 File 对象直接提供了一个 readlines(sizehint) 函数来完成这样的事情。以下面的代码为例: file = open('test.log', 'r')sizehint = 209715200 # 200Mposition = 0lines = file.readlines(sizehint)while not file.tell() - position < 0: position = file.tell() lines = file.readlines(sizehint) 每次调用 readlines(sizehint) 函数,会返回大约 200MB 的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 sizehint 指定的值大一点(除最后一次调用 readlines(sizehint) 函数的时候)。通常情况下,Python 会自动将用户指定的 sizehint 的值调整成内部缓存大小的整数倍。
1.2 执行文件操作
file在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象:file(name[, mode[, buffering]])
file()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。
mode是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个\n,而在windows中是‘\r\n’,用U模式打开文件,就是支持所有的换行模式,也就说‘\r’ ‘\n’ ‘\r\n’都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用\n代替。在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。
buffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。
file对象有自己的属性和方法。
利用file对象的属性可以对实现对文件的操作主要有:获取文件相关信息、读文件(获取内容)、写文件、关闭file对象
以下是和file对象相关的属性列表:
属性 | 描述 | 示例 | 输出结果 |
---|---|---|---|
file.mode() | 返回被打开文件的访问模式。 | fo=open(“Python读写文件.txt”,’r’) print(fo.mode) | r |
file.name() | 返回文件的名称。 | fo=open(“Python读写文件.txt”,’r’) print(fo.name) | Python读写文件.txt |
file.tell() | 返回指针在当前文件中的位置,按字符算,下一次读取会从该位置之后进行 | fo=open(“Python读写文件.txt”,’r’,encoding=’UTF-8’) content=fo.read(10) print(content) print(fo.tell()) | try somet 12 :似乎结果不同 |
file.seek(offset,[,from]) | 重新调整指针位置,from表示起始的参考位置,offset表示离参考位置的距离 | fo=open(“Python读写文件.txt”,’r’,encoding=’UTF-8’) content=fo.read(10) print(content) print(fo.tell()) position=fo.seek(0,0) content=fo.read(10) print(content) print(fo.tell()) | try somet 12 try somet 12 |
file.read() | 按字符读取文件内容,可以是二进制数据,而不仅仅是文字 | fo=open(“Python读写文件.txt”,’r’,encoding=’UTF-8’) content=fo.read(10) print(content) | try somet |
file.readline() | 整行读取 | fo=open(“Python读写文件.txt”,’r’,encoding=’UTF-8’) content=fo.readline() print(content) | …… |
file.readlines() | 整个文件一次性读取,此时要注意文件大小,以免产生错误 | fo=open(“Python读写文件.txt”,’r’,encoding=’UTF-8’) content=fo.readlines() print(content) | …… |
file.write() | 往文件中写内容,file对象要以写方式或追回方式打开 | fo=open(“Python读写文件.txt”,’a’,encoding=’UTF-8’) content=fo.write(“我只是试试”) | |
file.closed() | 关闭file对象 | fo=open(“Python读写文件.txt”,’a’,encoding=’UTF-8’) content=fo.write(“我只是试试”) fo.close() |
python逐行读取文件内容的三种方法 方法一: 复制代码 代码如下: f = open("foo.txt") # 返回一个文件对象 line = f.readline() # 调用文件的 readline()方法 while line: print line, # 后面跟 ',' 将忽略换行符 # print(line, end = '') # 在 Python 3中使用 line = f.readline() f.close() 方法二: 复制代码 代码如下: for line in open("foo.txt"): print line, 方法三: 复制代码 代码如下: f = open("c:\\1.txt","r") lines = f.readlines()#读取全部内容 for line in lines print line
1.3 其他注意事项
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现file_object = open("Python读写文件.txt",'r',,encoding='UTF-8') try: all_the_text = file_object.read( ) finally: file_object.close( )
注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。
更简洁的方式
with open('/path/to/file', 'r') as f: print(f.read())
自动帮我们调用close()方法
1.4 关于中文乱码问题
要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码。如果读入UTF-8编码的txt文件提示“builtins.UnicodeDecodeError: 'gbk' codec can't decode byte 0xa0 in position 76: illegal multibyte sequence”
的错误,可以如此操作,fo=open(“Python读写文件.txt”,’r’,,encoding=’UTF-8’);但是以这种用realines读入时,文件数据开头有“\ufeff”,原因如下:
在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识。
什么是BOM? BOM = Byte Order Mark BOM是Unicode规范中推荐的标记字节顺序的方法。比如说对于UTF-16,如果接收者收到的BOM是FEFF,表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。 UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明“我是UTF-8编码”。BOM的UTF-8编码是EF BB BF(用UltraEdit打开文本、切换到16进制可以看到)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。 所有的BOM在C/C++/Java中都被处理为"\uFEFF"(???貌似不一定。。。)
更详细可参考
这个标识在python和Java读取文件的时候,不会被去掉。如果用readLine()读取第一行存进String里面,这个String的length会比看到的大1,而且第一个字符就是这个BOM。
好在python会统一把BOM变成“\ufeff”,这样的话,就可以自己手动解决了(判断后,用substring()或replace()去除掉这个BOM):
if(line.startsWith("\ufeff")){ //line = line.substring(1); line = line.replace("\ufeff", ""); }
1.5 利用Pandas库读取文件数据
pandas中有很多种读数据的函数,像读文本的read_table()函数,读csv文件的read_csv()函数。1.6 spark中读取文件或获取数据的方法
textFile(name, minPartitions=None, use_unicode=True)Read a text file from HDFS, a local file system (available on all nodes), or any Hadoop-supported file system URI, and return it as an RDD of Strings.
If use_unicode is False, the strings will be kept as str (encoding as utf-8), which is faster and smaller than unicode. (Added in Spark 1.2)
wholeTextFiles(path, minPartitions=None, use_unicode=True)[source]
Read a directory of text files from HDFS, a local file system (available on all nodes), or any Hadoop-supported file system URI. Each file is read as a single record and returned in a key-value pair, where the key is the path of each file, the value is the content of each file.
If use_unicode is False, the strings will be kept as str (encoding as utf-8), which is faster and smaller than unicode. (Added in Spark 1.2)
Spark SQL中读取文件和获取数据
来源,以下的spark均表示已存在的SparkSession
spark.read.json
# spark is an existing SparkSession df = spark.read.json("examples/src/main/resources/people.json") # Displays the content of the DataFrame to stdout df.show() # +----+-------+ # | age| name| # +----+-------+ # |null|Michael| # | 30| Andy| # | 19| Justin| # +----+-------+
spark.read.load
df = spark.read.load("examples/src/main/resources/users.parquet") df.select("name", "favorite_color").write.save("namesAndFavColors.parquet")
df = spark.read.load("examples/src/main/resources/people.json", format="json") df.select("name", "age").write.save("namesAndAges.parquet", format="parquet")
spark.read.parquet
df = spark.read.parquet("examples/src/main/resources/users.parquet")
JDBC To Other Databases
2、R中文件操作
2.1 获取文件操作权限
2.2 执行文件操作
2.3 其他注意事项
2.4 关于中文乱码问题
3、Java中文件操作
3.1 获取文件操作权限
3.2 执行文件操作
3.3 其他注意事项
3.4 关于中文乱码问题
相关文章推荐
- Windows下比较两个文件的不同(命令行操作/相关软件)
- Python中存取文件的4种不同操作
- MongoDB学习笔记(五) MongoDB文件存取操作
- VC 目录、文件的相关操作
- OpenSSL与KeyTool相关操作(二)生成keystore和key文件——Windows7_32版
- 文件操作相关
- ios中文件的相关操作:读,写,删除
- Linux操作复习(一):文件命令相关
- hadoop配置文件详解、安装及相关操作补充版
- Linux---快捷键+文件相关操作
- oracle数据库系列-Archivelog归档文件相关操作
- C#文件操作常用相关类(Directory类、File类、Path类)
- C++外部文件读取相关操作
- Linux----3-----文件相关操作
- rhel6文件系统属性更改相关操作
- vim 文件保存退出 文件相关操作汇总
- shell文件操作相关命令
- 【方法总结】创建、读取、删除文件相关操作
- iOS 文件操作相关
- Spring 的优秀工具类盘点,第 1 部分: 文件资源操作和 Web 相关工具类