精华内容
下载资源
问答
  • 文件io的只open不close
    千次阅读
    2021-03-17 02:39:27

    如果文件以读/写方式打开,或者以不存在的方式创建,然后以读/写方式打开,最好的方法是什么? 根据我的阅读, file = open('myfile.dat', 'rw')应该这样做,对吗?

    它对我不起作用(Python 2.6.2),我想知道这是否是版本问题,或者不应该那样工作或做什么。

    最重要的是,我只需要解决这个问题。 我对其他东西很好奇,但是我所需要的只是做开始部分的好方法。

    封闭目录可由用户和组而非其他用户(我在Linux系统上...因此权限775)可写,确切的错误是:

    IOError:没有这样的文件或目录。

    #1楼

    以下方法的优点是,即使在执行过程中引发了异常,文件也会在块的末尾正确关闭 。 它等效于try-finally ,但是要短得多。

    with open("file.dat","a+") as f:

    f.write(...)

    ...

    a +打开一个文件以进行附加和读取。 如果文件存在,则文件指针位于文件的末尾。 该文件以追加模式打开。 如果该文件不存在,它将创建一个用于读取和写入的新文件。 -Python文件模式

    seek()方法设置文件的当前位置。

    f.seek(pos [, (0|1|2)])

    pos .. position of the r/w pointer

    [] .. optionally

    () .. one of ->

    0 .. absolute position

    1 .. relative position to current

    2 .. relative position from end

    只允许使用“ rwab +”字符; 必须完全是“ rwa”之一-请参阅Stack Overflow问题

    #2楼

    我认为是r+而不是rw 。 我只是一个入门者,这就是我在文档中看到的内容。

    #3楼

    我的答案:

    file_path = 'myfile.dat'

    try:

    fp = open(file_path)

    except IOError:

    # If not exists, create the file

    fp = open(file_path, 'w+')

    #4楼

    使用:

    import os

    f_loc = r"C:\Users\Russell\Desktop\myfile.dat"

    # Create the file if it does not exist

    if not os.path.exists(f_loc):

    open(f_loc, 'w').close()

    # Open the file for appending and reading

    with open(f_loc, 'a+') as f:

    #Do stuff

    注意:打开文件后必须将其关闭, with上下文管理器是让Python为您解决此问题的一种好方法。

    #5楼

    open('myfile.dat', 'a')对我open('myfile.dat', 'a') ,就好。

    在py3k中,您的代码引发ValueError :

    >>> open('myfile.dat', 'rw')

    Traceback (most recent call last):

    File "", line 1, in

    open('myfile.dat', 'rw')

    ValueError: must have exactly one of read/write/append mode

    在python-2.6中,它引发IOError 。

    更多相关内容
  • 如果关闭文件,会怎么样?对于在个人电脑上没什么影响。如果你执行的python程序结束了,文件会自动关闭。服务器端如果关闭文件,会出现句柄泄露,导致句柄耗尽。2、对于linux系统,每次做一件事,就会打开一个...

    1、with基于上下文,会自动帮助我们关闭文件。

    如果不关闭文件,会怎么样?对于在个人电脑上没什么影响。如果你执行的python程序结束了,文件会自动关闭。

    服务器端如果不关闭文件,会出现句柄泄露,导致句柄耗尽。

    2、对于linux系统,每次做一件事,就会打开一个文件,进行读,写。。。等操作,然后关掉。但是打开的文件在linux系统有一个上限,不能打开过多的文件,上限是65535个文件。

    服务器端开的文件一般是不关闭的,服务器的进程不会自己结束掉的。如果打开的文件个数超过65535个,就会出现句柄耗尽,其他linux所有的文件都被卡死了。这个时候打开文件会发现操作系统没有可用的句柄了。所以不关闭文件一般对服务器端有限制。

    3、文件如果没有关闭,会导致你写入的内容,没有真正写到磁盘上;

    不关文件是否可以让文件的内容实时写入磁盘里面,而不是最后等到关闭文件才写入?

    答案是可以的。可以使用flush()配合open()来实现。经验证,flush()之前是没有写入的,flush()之后数据写入文件了。

    flush就是实时刷新,把你写入的文件内容写到磁盘里。Windows之所以会有这种机制,是因为如果每写入几个字符就要操作一次IO的话,对磁盘的压力会特别大。

    而flush()之后再输入的数据就没有被写入文件中。

    知识补充:

    句柄当做一个人的名字,并"可以通过名字(句柄),实现对句子的引用和访问", 感觉这种比喻好象贴近,但问题是可能有许多人叫同一个名字,但句柄之所以有意义正因为它具有唯一性,所以这种比喻也有问题。

    如果换个说法,说句柄是表示你的进程与外界的i/o连接,把它当作是一个连接的名字是不是更恰当些?

    文件句柄是一个十六位长度的二进制代码(Windows95后为32位无符号整 数),代表一个已被打开文件的通道号,借助于这个句柄,你的应用程序即可使用这个相应的句柄对文件进行随意存取操作,说白了文件句柄其实是一串代表着特殊含义的号码;

    当然其实系统是用句柄与一些资源联系起来的,当由系统管理,动态分配给你应用程序的某些资源的代号,你就可以使用句柄访问相应的资源了,尤其在Windows系统中,有很多东西都使用句柄,如窗口,socket。

    句柄泄露示例,参考:https://www.cnblogs.com/wendiyou/p/11372666.html

    展开全文
  • 1、close函数的函数原型 #include <unistd.h>; int close(int fd); 该函数的作用是:关闭一个文件描述符。fd就是文件描述符。...当我们关闭一个文件时,我们使用的fd是从open这个系统调用里面返

    1、close函数的函数原型
    #include <unistd.h>;
    int close(int fd);
    该函数的作用是:关闭一个文件描述符。fd就是文件描述符。
    在ubuntu界面输入“man 2 close”即可查看close函数的相关信息,“2”是指close在man手册的第2页。
    2、思考:close函数里面的fd参数是怎么来的呢?
    首先,每一个文件都有文件描述符与之对应的;文件描述符是打开文件之后由系统给我们分配的;当我们关闭一个文件时,我们使用的fd是从open这个系统调用里面返回回来的返回值。(在“man 2 open”的信息中,可以看到open函数打开失败的话是返回-1,打开成功的话就会返回一个新的文件描述符;“man 2 close”,对于close函数来说,也是有返回值的,如果关闭成功要返回0,失败则返回-1)
    3、思考:为什么要在操作完文件以后关闭文件文件描述符呢?
    因为文件描述符的数量是有限制的,一般为1024个,有的情况下文件描述符会超过限制;当我们使用系统调用close关闭文件描述符以后,先前open系统调用返回的文件描述符fd就变得无效啦,内核就可以随时重用fd参数。后续若仍有open调用,还可以把文件描述符重新作为返回值。
    close函数应用实例:(在open的基础上做了修改)

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    main() {
    	int fd;
    	//为什么这里定义的fd(用来保存文件描述符)是int类型呢?因为在ubuntu中使用man 2 open命令
    	//打开可以看到open函数的返回值就是int型的
    	fd = open("a.c",O_CREAT|O_RDWR,0666);
    	//open"a.c文件",由于本来没有该文件,所以要用到O_CREAT
    	//由于用到了O_CREAT,所以需要第三个参数,也就是文件的权限
    	//此处设置的权限为0666,第一个0表示是八进制数,即:随意用户可读可写
    	//打开当前路径下的a.c 
    	//看一下是否能够打开成功,如果没有这个文件,就会创建这个文件,因为加入了O_CREAT
    	if(fd<0){
    		printf("open is error\n");
    		}
    	printf("fd is %d\n",fd);
    	close(fd);
    	return 0;
    }
    

    执行该close程序,在ubuntu界面打印为3,就是说关闭了以后,这个“3”能重新被内核使用。
    在这里插入图片描述

    展开全文
  • Linux文件IO-open,write,read,lseek,close

    千次阅读 2017-08-09 15:16:01
    在linux编程中,经常用到open,write,read,lseek,close这几个函数。这里系统总结一下。

    在linux编程中,经常用到open,write,read,lseek,close这几个函数。这里系统总结一下。

    一、函数open

    参考:https://linux.die.net/man/2/open

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    int open(const char *pathname, int flags);
    int open(const char *pathname,int flags, mode_t mode);
    int creat(const char *pathname, mode_t mode);

    返回值:若成功,返回一个文件描述符fd;若失败,返回-1
    函数参数:

    • pathname :打开文件的路径名
    • flags:用来控制打开文件的模式
    • mode:用来设置创建文件的权限(rwx)。当flags中带有 O_CREAT 时,也就是创建新文件时才有效。

    函数creat只是用于创建新文件,这样对比看来open的功能更加强大。
    由于open函数完全可以替代creat函数,所以现在基本上不用creat函数了。

    下面对各个参数进行详细的说明:
    flags参数说明:

    • O_RDONLY:只读模式
    • O_WRONLY:只写模式
    • O_RDWR:可读可写模式

    flags参数必须包括以上3个参数之一,并且只能选择一个。
    还有一些flags参数是可选的,如下:

    • O_APPEND 以追加的方式打开文件
    • O_CREAT 创建一个文件
    • O_EXEC 如果使用了O_CREAT而且文件已经存在,就会发生一个错误
    • O_NOBLOCK 以非阻塞的方式打开一个文件
    • O_TRUNC 如果文件已经存在,则删除文件的内容

    我们可以用符号“|”分隔开,例如,flags为O_RDWR | O_APPEND,表示以可读可写的模式打开文件并且追加到文件后面。
    如果flags中使用了O_CREAT标志,则调用open函数的时候需要加上打开文件的模式,设置文件的用户权限。也就是说使用O_CREAT标志时,open的原型应该是这样的:int open(const char *pathname, int flags, mode_t mode);
    用过chmod命令的就知道这个怎么用了,可以用八进制数据表示,
    其中4:读权限,2:写权限,1:可执行权限,0:无权限。
    下面是mode可取的一些值,都是八进制的值,使用这些值的时候需要包含头文件:sys/types.h,sys/stat.h

    • S_IRWXU 00700 用户可以读
    • S_IRUSR 00400 用户可以写
    • S_IWUSR 00200 用户可以执行
    • S_IXUSR 00100 用户可以读、写、
    • S_IRWXG 00070 组可以读
    • S_IRGRP 00040 组可以写
    • S_IWGRP 00020 组可以执行
    • S_IXGRP 00010 组可以读写执行
    • S_IRWXO 00007 其他人可以读
    • S_IROTH 00004 其他人可以写
    • S_IWOTH 00002 其他人可以执行
    • S_IXOTH 00001 其他人可以读、写
    • S_ISUID 04000 设置用户执行ID
    • S_ISGID 02000 设置组的执行ID

    实际生成的文件的权限还要受到进程的权限掩码的影响的
    如果生成的文件权限跟自己设置的不相符合,请看看是否是root模式下执行的

    二、函数write

    参考:https://linux.die.net/man/2/write

    #include <unistd.h>
    ssize_t write(int fd, const void *buf, size_t count);

    返回值:若成功,返回已写的字节数;若出错,返回-1
    功能:write 函数把buf指针指向的内容写入count 字节数据到文件描述符为fd的文件 。返回值一般总是等于 count,否则就是出错了。
    常见的出错原因是磁盘空间满了或者超过了文件大小限制。如果打开文件时使用了 O_APPEND ,则每次写操作都将数据写入文件末尾。

    三、函数read

    参考:https://linux.die.net/man/2/read

    #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t count);

    返回值:返回所读取的字节数;0(读到EOF);-1(出错)。
    功能:read 函数会从文件描述符fd的文件中读取count字节到从buf地址开始的缓存中。
    参数:

    • fd: 要读取数据的文件描述符。
    • buf:存放读取的数据缓冲区。
    • count: 一次read操作,读多少数量的字节。

    以下几种情况会导致读取到的字节数小于 count :

    1. 读取普通文件时,读到文件末尾还不够 count 字节。
    2. 从终端设备读取时,一般情况下每次只能读取一行。
    3. 从网络读取时,网络缓存可能导致读取的字节数小于 count字节。
    4. 读取 pipe 或者 FIFO 时,pipe 或 FIFO 里的字节数可能小于 count 。 
    5. 在读取了部分数据时被信号中断。
    

    总结:读取到的字节数小于想要读取的字节count,说明了源头没有那么多数据可读。

    四、函数lseek

    参考:https://linux.die.net/man/2/lseek

    #include <sys/types.h>
    #include <unistd.h>
    off_t lseek(int fd, off_t offset, int whence);

    返回值:若成功则返回目前的读写位置,也就是距离文件开头多少个字节。若错误则返回-1。

    所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于 cfo,并且使 cfo 增大,增量为读写的字节数。文件被打开时,cfo 会被初始化为 0,除非使用了 O_APPEND 。使用 lseek 函数可以改变文件的 cfo 。

    参数说明:

    • Offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)。

    • whence为下列其中一种:(SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2)

      1. SEEK_SET 将读写位置指向文件头后再增加offset个位移量。
      2. SEEK_CUR 以目前的读写位置往后增加offset个位移量。
      3. SEEK_END 将读写位置指向文件尾后再增加offset个位移量。

    当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现。
    举几个例子:

    1. 将读写位置移到文件开头:
      lseek(fd,0,SEEK_SET)
    2. 将读写位置移到文件尾:
      lseek(fd,0,SEEK_END)
    3. 取得目前文件位置:
      lseek(fd,0,SEEK_CUR)

    五、函数close

    参考:https://linux.die.net/man/2/close

    #include <unistd.h>
    int close(int fd);

    返回值:若成功,返回0;若出错,返回-1
    关闭一个文件时还会释放该进程加在该文件上的所有记录锁。
    当一个进程终止时,内核自动关闭它所有的打开文件。很多程序利用了这一功能而不显示地用close关闭打开的文件。

    六、示例程序

    //open.c
    #include <stdio.h>
    #include <stdlib.h>
    
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #define FILENAME "hello"
    
    int main()
    {
        //实际生成的文件的权限还要受到进程的权限掩码的影响的
        //如果生成的文件权限跟自己设置的不相符合,请看看是否是root模式下执行的
        int fd = open(FILENAME,O_RDWR | O_CREAT,0777);
        if(fd < 0)
        {
            perror("open");
        }
        printf("open success!\n");
        char write_buf[] = "helloworld!\n";
        if (write(fd,write_buf,sizeof(write_buf)))
        {
            perror("write");
        }
        printf("write success !\n");
        //将文件偏移指针重新指向开头
        if(lseek(fd,0,SEEK_SET) < 0)
        {
            perror("lseek");
        }
        printf("lseek success !\n");    
        char read_buf[20] = {0};
        if (read(fd , read_buf , 20) < 0)
        {
            perror("read");
        }
        printf("read success !\n");
        printf("read_buf = %s\n",read_buf);
        return 0;
    }
    

    实验结果:

    ubuntu:~/test/170809-IO/open$ gcc open.c -o open
    ubuntu:~/test/170809-IO/open$ ./open
    open success!
    write: Success
    write success !
    lseek success !
    read success !
    read_buf = helloworld!
    ubuntu:~/test/170809-IO/open$ ls
    hello  open  open.c
    ubuntu:~/test/170809-IO/open$ cat hello 
    helloworld!
    展开全文
  • 读写文件背景读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统允许普通的程序直接操作磁盘。读写文件就是请求操作系统打开一...
  • Linux 文件IO操作

    千次阅读 2022-03-21 14:43:18
    概述 本片文章将会主要介绍四个IO函数:开关读写 open函数 open 函数的输入参数是 open(char* ,...文件不存在则创建(可以防止重复创建) O_TRUNC 擦除文件内容再打开 O_APPEND 追加方式打开(不会清除文件内容)
  • C/C++文件IO函数

    千次阅读 2022-01-27 09:26:08
    文件(file)通常是在磁盘或固态硬盘上的一段已命名的存储区。C中采用的主要是文件指针的办法,C++中对文件的操作主要运用了“文件流”(即非标准的输入输出)的思想。 一、C C把文件看作是一系列连续的字节,每个...
  • Linux文件IO_01

    千次阅读 2019-04-08 16:22:43
    Linux文件IO0.综述1.Linux常用文件IO接口(API)3.IO实例3.1打开文件3.2读取文件内容3.3向...操作一个文件一般是先打开(open)一个文件,得到这个文件文件描述符,然后对文件进行读写(read/write)或其他操作,...
  • 简介 当你正在编程时,运用了file.read()的函数来读取文件信息,但在之后在写的过程中忘记关闭了它, 则可能发生严重的...open() 然后你可以使用这个文件描述符来用读或写的函数对文件进行操作,列如 read() write()
  • 文件IO、标准IO的区别及其效率

    千次阅读 2021-09-05 17:34:59
    系统IO:Unix/Linux下的系统文件IO,...文件I/O是操作系统封装了一系列openclose、write、read等API函数构成的一套用来读、写文件的接口供应用程序使用,通过这些接口可以实现对文件的读写操作,但是效率并不是最...
  • 本文主要讲述的是文件I/O操作的2.6.11内核版本实现,包括了主要的数据结构、宏定义和函数流程。分别讲述open,create,close,read,write,lseek系统调用。
  • 标准IO文件IO 的区别

    千次阅读 2017-09-05 14:15:02
    在谈两者区别之前,先来了解下什么是标准IO以及文件IO。1 定义标准IO: 标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头中的定义,具有一定的可移植性。标准IO库处理很多细节。例如缓存...
  • 文件IO函数接口学习思路: 打开文件-----open 读写文件-----read,write 关闭文件-----close 在具体讲解文件IO的各个函数接口之前想为大家介绍一下文件描述符这个新概念 文件描述符是很小的非负的整数 int 0到1023 ...
  • Linux详解 --- 系统文件IO操作与文件描述符

    千次阅读 多人点赞 2021-12-10 08:37:01
    Linux中的IO操作(思维导图一览) 语言IO操作与系统IO操作 文件描述符详解与底层结构
  • 摘要:在Java中,想要读写文件,大多采用的都是流的形式,那么今天就来记录一下这传说中的流。 目录 一、流的简单介绍 二、写出文件Demo&lt;并设置编码&gt; 三、读取文件Demo&lt;并设置编码&gt;...
  • Linux学习日记8——文件IO函数

    千次阅读 2022-03-21 21:58:00
    学习视频链接: ...spm_id_from=pageDriver ...二、open / close 函数 2.1 linux 下查看 open 命令 2.2 函数原型 2.3 操作 2.4O_CREAT 2.5O_TRUNC 2.6 常见错误 三、read / write 函数 3.1 函..
  • Golang——文件创建和写入、OpenFile追加写入、Open读取文件、ReadBytes缓冲区读取、os.Args、flag
  • 使用方式有只读、写、既读又写、在文件末尾添加数据、以文本方式使用、以二进制方式使用等多种。 打开文件可以通过以下两种方式进行: 调用流对象的 open 成员函数打开文件。 定义文件流对象时,通过构造函数打开...
  • 文件IO——文件IO相关概念

    千次阅读 2017-04-02 15:14:48
    1、API2、文件描述符(fd)3、文件IO和标准IO的异同4、man手册的查询5、退出进程(1)打开文件时如果出错,后面的操作就应该继续进行。...7、常见的文件IO的API常用文件IO的API 有openclose,write,r
  • ⭐️这篇博客就要开始聊一聊Linux中基础IO相关知识,IO相信大家都陌生,我们在C/C++中对文件进行读写的操作,也就是文件IO,这篇博客我也会带大家回顾一下。这篇博客还会介绍系统中的文件IO调用的接口,还有文件...
  • 首先了解下什么是标准IO以及文件IO。 标准IO:标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性。标准IO库处理很多细节。例如缓存分配,以优化长度...
  • python读取文件之with open()

    千次阅读 2019-11-28 13:59:12
    open()完成后必须调用close()方法关闭文件,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的,由于文件读写时都有可能产生IOError,一旦出错,后面的f....
  • Linux文件IO_02

    千次阅读 2019-04-09 16:14:59
    Linux文件IO_024.lseek函数详解4.1lseek函数介绍4.2lseek实践:计算文件长度5.文件共享的实现5.1文件共享概念5.2文件共享的3种实现方式5.3文件描述符细节6.C语言标准库的文件IO介绍 4.lseek函数详解 4.1lseek函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 257,657
精华内容 103,062
热门标签
关键字:

文件io的只open不close