python内置库--csv模块

1

2 相关函数介绍

csv.reader() csv.writer()

csv.reader(csvfile, dialect='excel', **fmtparams)
返回一个 reader 对象,该对象将逐行遍历csvfile

csvfile 可以是任何对象,只要这个对象支持 iterator 协议并在每次调用 next() 方法时都返回字符串,file objects 和 list objects适用。如果 csvfile 是file objects,则打开它时应使用 newline=''

csv.writer(csvfile, dialect='excel', **fmtparams)
返回一个 writer 对象,

csvfile 可以是任何具有 write() 方法的对象。 如果 csvfile 是一个file object,则打开它时应使用 newline=''

可指定参数delimiter,用于在文件中分割字符,默认是逗号

**fmtparams 代表一些列参数字段,这些参数字段决定了具体按照何种格式来read或write

image
执行
image
写入的文件如下
image
如上,每一行中间多了一个空行,这不是我们所期望的,以上是没有指定参数换行符newline的结果,
没有执行时,csv模块会执行通用换行符,unix平台是'\n',win平台是'\r\n'

下面加上参数newline
image
执行
image
文件内容
image

csv.DictWriter()和csv.DictReader()

数据以dict的形式写入和输出
image
执行
image
文件
image

由于每一行输出的形式是dict ,所以可以按照字段来取值
image

image

csv.reader() csv.writer()中的**fmtparams

**fmtparams 代表一些列参数字段,这些参数字段决定了具体按照何种格式来read或write,用户可以自定义这些字段值,具体如下
delimiter
quotechar
quoting
doublequote
escapechar
lineterminator
skipinitialspace

delimiter

指定内容间的分割字符,只能是一个单字符,默认是逗号

quotechar

A one-character string used to quote fields containing special characters, such as the delimiter or quotechar, or which contain new-line characters. It defaults to '"'

一个单字符,用于包住含有特殊字符的字段,特殊字符如 定界符 或 引号字符 或换行符。默认为 '"'
注意对照看英文解释 一些意思表达比较准确

quoting

控制 writer 何时生成引号,以及 reader 何时识别引号。该属性可以等于任何 QUOTE_* 常量
默认为 QUOTE_MINIMAL

csv.QUOTE_MINIMAL
Instructs writer objects to only quote those fields which contain special characters such as delimiter, delimiter or any of the characters in lineterminator

指示 writer 对象仅为包含特殊字符(例如 delimiter指定的字符、delimiter指定的字符 或 行结束符 中的任何字符)的字段加上引号

先看几个例子
image
执行生成的文件
image

image
生成的文件
image

执行生成的文件

在第一例子中,分隔符delimiter是-,第个例子则是我们常见的逗号
所以列表['Baked','Beans']的两个数据 一个写成 Baked-Beans 另一个写成Baked,Beans

关于quotechar,我的理解是,当字段中出现一些特殊字符时,quotechar指定的字符就会把这样的字段包裹起来,这些特殊字符包括delimiter指定的字符、\r\n、quotechar本身指定的字符

第一个例子中['ab\r\ncd']满足这个条件,所以内容的首尾被quotechar指定的字符指定的字符包裹起来了
第2个例子中['Sp,am']也满足这个条件
有点特殊的是第一个例子中的['a|b'] 他不仅把头尾包裹起来,还多出了2个quotechar字符,这个暂时没有明白

quoting

quoting感觉和quotechar的作用有些重复,暂时黑没有弄明白

本文转载于网络 如有侵权请联系删除

相关文章

  • 走进计算机病毒-基础知识「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。目录进程与线程的关系动态链接库服务注册表病毒对注册表的利用1.和Run键相关的项(1)Run键是病毒最青睐的自启动之处,该键的位置有两处(2)RunOnce(3)RunServicesOnce(4)RunServices(5)RunOnceEx2.Run相关以外的自启动项(1)UserInit(2)load键查看注册表自启动项的工具Autoruns.exe利用注册表改变文本文件所关联的程序通常解决病毒修改文件关联的问题可以用以下方法,以.txt为例子1.直接改注册表2.利用文件夹选项对话框利用注册表禁止某些程序的运行说明:解决办法进程与线程的关系线程是执行任务,完成功能的基本单位,而进程则为线程提供了生存空间和线程所需要的其他资源,程序则是包含资源分配管理代码以及线程执行调度代码的一个静态计算机代码集合动态链接库动态链接库DLL,它是DynamicLinkLibrary的缩写形式。动态链接库(DLL)是作为共享函数库的可执行文件(这里所谓的DLL是可执行程序,也是PE格式的文件,但是它不能够独立运行,只能够通过其他课运行的程序加载到内存中执行功能

  • idea汉化教程[通俗易懂]

    大家好,又见面了,我是你们的朋友全栈君。1.同样的,第一步,打开软件2.进入软件后依次点击file→settings3.接着点击plugins4.然后点击Marketplace(在线搜索插件)5.在搜索框输入chinese(看到这个名字,知道是啥了吧),找到Chinese(simplifed)Language这个插件,然后点击安装6.等待安装完成后点击RestartIDE7.点击Restart8.然后软件会重启,等待重启后,进入软件,然后你会发现,和你想象中的一样了发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/130113.html原文链接:https://javaforall.cn

  • 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?

    先前介绍了Java集合框架的典型容器类,它们绝大部分都不是线程安全的,仅有的线程安全实现,比如Vector、Stack,在性能方面也远不尽如人意。幸好Java语言提供了并发包(java.util.concurrent),为高度并发需求提供了更加全面的工具支持今天我要问你的问题是,如何保证容器是线程安全的?ConcurrentHashMap如何实现高效地线程安全?典型回答Java提供了不同层面的线程安全支持。在传统集合框架内部,除了Hashtable等同步容器,还提供了所谓的同步包装器(SynchronizedWrapper),我们可以调用Collections工具类提供的包装方法,来获取一个同步的包装容器(如Collections.synchronizedMap),但是它们都是利用非常粗粒度的同步方式,在高并发情况下,性能比较低下。另外,更加普遍的选择是利用并发包提供的线程安全容器类,它提供了:各种并发容器,比如ConcurrentHashMap、CopyOnWriteArrayList。各种线程安全队列(Queue/Deque),如ArrayBlockingQueue、Synchro

  • 12个顶级Chrome插件!提升工作效率就是这么简单粗暴!

    “啊啊啊!最近工作上比较忙,这篇文章还是强行抽时间写的,(JSPromise的执行顺序真的恶心。。。),加上上周搬家,没怎么写原创技术文章。后面一定补上!”上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的Chrome浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。我下面就把我日常工作和学习中经常用到的一些Chrome浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。MarkdownHereMarkdownHere可以让你更愉快的写邮件,由于支持Markdown直接转电子邮件格式,你无需太多精力,就能写出美观的电子邮件。下面我实际测试的效果:SimilarSites查看你当前所浏览的网站相似的一些网站,很不错!SimilarSitesOctotreeOctotree可以让我们在Github上浏览代码更加方便和优雅。OctotreeOneTab一键收纳你正在浏览的网页!非常实用!比如我们做一件事情经常会打开很多的网页,这时候有另外一件事情来了,你就可以利用这个插件将之前浏览的网页给隐藏了!Momentum专注、待办清单.....Momen

  • Ubuntu 20.04 LTS 时间表,4 月 23 日发布稳定版

    Ubuntu19.10生命周期将在今年7月结束,之后一段时间内最大的版本则是Ubuntu20.04LTS,其重大更新和改进将在2030年前终止。20.04是Ubuntu的第8个LTS版本,计划于明年4月23日发布。Canonical会为10份月发布的版本制定25周时间表和4月发布的版本制定27周时间表来指导LTS的发展,Ubuntu20.04的开发生命周期遵循的正是27周的发布时间表。如Ubuntuwiki所示,从这个表中我们可以看到几个关键节点:2月27日:特性冻结Ubuntu团队停止引入新特性、程序包和API,他们开始专注于修复开发版本中的bug。3月19日:冻结用户界面此时,用户界面中不会发生其它更新。随后,文档处理也将开始,包括最新的屏幕截图。3月26日:冻结文档字符串完成所有特性和用户界面更新之后,文档中将停止创建和修改字符串。如果在稍后阶段需要更改字符串,则在获得团队批准的情况下才可以添加。4月2日:测试版冻结开发人员在Ubuntu正式发布之前体验Ubuntu测试版本并提出bug或错误修复建议。4月9日:内核冻结内核冻结是内核更新的最后期限。4月16日:最终冻结最终冻结是最

  • Excel揭秘22:其实可以在编写VBA代码时直接添加行号

    很多现代的代码编辑器在其左侧都会显示代码所在行的行号,然而在VBE中输入代码时,我们看不到行号,其实,我们可以在输入代码时直接手工添加行号。如下面的测试代码,我在输入代码时也手动添加了行号:SubAddLineNo()1DimstrAsString2str="完美Excel"3MsgBoxstrEndSub运行代码结果如下图1所示。图1完全没有问题!当然,有一些插件,可以自动给VBA代码添加行号,如果你需要这个功能的话,可以搜索一下,看有没有合适的。那么,添加行号有什么用处呢?我认为最大的用处之一就是在代码调试时可以迅速定位到出错的代码语句。在VBA中,有一个名为Erl的函数,可以用于返回发生错误的语句所在的行号。如下面的代码所示:SubtestAddLineNo()1OnErrorGoToerrHDimiAsLong2i="完美Excel"Finish:3ExitSuberrH:4MsgBox"错误发生行的行号:"&ErlEndSub运行代码的结果如下图2所示。图2注意,如果代码没有添加行号,Erl函数将返回0。欢迎

  • Facebook开源NLP建模框架PyText

    编译:chux出品:ATYUN订阅号FacebookAIResearch宣布推出PyText的开源版本,PyText是一个NLP建模框架,每天为Facebook及其应用程序系列用户提供超过10亿次预测。PyText为Facebook新的Portal智能显示器以及FacebookMessenger智能助手M的语音命令提供支持。自然语言处理涉及系统如何解析人类语言并能够做出决策并获得洞察力。Facebook表示,PyText框架是AI研究人员在实验和部署之间更快地进行移动的渠道,对于文档分类,序列标记,语义分析和多任务建模等任务尤其实用。M会听取在聊天应用对话中使用的单词,比如预约优步乘车服务,祝朋友生日快乐,推荐Spotify歌曲或食谱等内容。此外,Portal智能显示器还推出一些新功能,包括智能相机的自定义控制,使用AI来构建视频通话,以及可以简单地说“打电话给妈妈”,而不需要说出她的全名,这些能力由PyText提供支持。“我们计划将PyText作为我们未来的主要NLP平台,”FacebookAI研究工程师AhmedAlyHegazy和ChristopherDewan表示,“AI研究人

  • tfs三大管理工具操作示例

    tfs三大管理工具操作示例大家都知道tfs分布式存储安装方法,特别是v1版本的,v2版本的几乎没人讲,维护的文档更是少之又少,tfs要是用好了确实是好东西,虽说开源了,但是很少人敢于尝试,主要是坑太多,坑太多是因为需要了解的知识点太多,没有完善的文档,所以一直推广不起来,只能淘宝和与之相关的公司在用了。不多说了,能开源就不错啦,本篇只讲下tfs三大管理工具:tfstoolssm admintool。一,tfstool[root@tfsdatasvr1~]#/usr/local/tfs/bin/tfstool-s192.168.88.197:8100[2016-10-2509:42:18]DEBUGbase_packet_factory.cpp:48[140724280203104]pcode:20, length:28[2016-10-2509:42:18]DEBUGsocket.cpp:113[140724280203104]打开,fd=4, addr=192.168.88.197:8100[2016-10-2509:42:18]INFO transport.cpp:394[1407

  • Docker 学习系列二之基本管理

    概述之前对docker的基本的工作原理进行了简单的介绍和学习Docker工作原理今天开始不断的学习Docker的容器、镜像和仓库管理。Docker容器管理Docker常用管理操作test@dev:~$dockerps-a CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 26ed33c0a572wordpress"docker-entrypoint.sh"47hoursagoExited(0)47hoursagomywordpress 083ddb3cbaf0mariadb"docker-entrypoint.sh"47hoursagoExited(0)47hoursagodb复制containerID默认128位,但是一般前16位即可保证其在本机的唯一性。image代表了镜像。command在创建容器时执行的命令,status该容器的状态信息。创建容器#dockerrun参数dockerrun--namedb--envMYSQL_ROOT_PASSWORD=123-dmysql参数详解:—name:容

  • Linux权限管理

    Linux权限管理是其一大特色,优秀的权限管理机制为Linux安全性提供了可靠的保障。###一、用户权限管理:root用户是系统的超级用户,是Linux系统的CEO,它具有最高的管理权限,所以一般不用该用户登录系统进行日常的操作与维护,root可将某些权限赋予其他用户来管理系统的某些资源。su命令用来切换用户,用该命令切换用户时,用户身份和环境变量都发生改变。例如:kelvin@kelvin-laptop:~$ls examples.desktopworkplace公共的模板视频图片文档下载音乐桌面 kelvin@kelvin-laptop:~$suws 密码: ws@kelvin-laptop:/home/kelvin$复制在ubuntu系统中,有些动作需要管理员的权限才能执行,可用sudo来提升权限。若在/etc/目录下建立nologin文件,则只允许root用户登录。相反,删除该文件则所有用户都可以登录系统。###二、文件权限管理:使用ls-l命令可以以长格式显示该目录下文件和子目录信息。如:kelvin@kelvin-laptop:~$ls-l 总用量40 -rw-r--r--

  • 优先队列的优先级_kafka优先级队列

    大家好,又见面了,我是你们的朋友全栈君。概念☺优先队列是一种用来维护一组元素构成的结合S的数据结构,其中每个元素都有一个关键字key,元素之间的比较都是通过key来比较的。优先队列包括最大优先队列和最小优先队列,优先队列的应用比较广泛,比如作业系统中的调度程序,当一个作业完成后,需要在所有等待调度的作业中选择一个优先级最高的作业来执行,并且也可以添加一个新的作业到作业的优先队列中。优先队列的实现中,我们可以选择堆数据结构,最大优先队列可以选用大堆,最小优先队列可以选用小堆来实现。特点☺优先级队列是0个或多个元素的集合,每个元素都有一个优先权或值。☺当给每个元素分配一个数字来标记其优先级时,可设较小的数字具有较高的优先级,这样更方便地在一个集合中访问优先级最高的元素,并对其进行查找和删除操作。☺对优先级队列,执行的操作主要有:(1)查找,(2)插入,(3)删除。☺在最小优先级队列(minPriorityQueue)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素。☺在最大优先级队列(maxPriorityQueue)中,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素

  • 面试系列-mysql锁机制及死锁排查

    多事务更新同一行数据时加独占锁避免脏写如果有事务在表里执行增删改操作,那在行级会加独占锁,此时其实同时会在表级加一个意向独占锁;如果有事务在表里执行查询操作,那么会在表级加一个意向共享锁。其实平时操作数据库,比较常见的两种表锁,反而是更新和查询操作加的意向独占锁和意向共享锁,但是可以忽略这个意向独占锁和意向共享锁,因为两种意向锁根本不会互斥;锁的类型表锁读锁(readlock)也叫共享锁(sharedlock)针对同一份数据,多个读操作可以同时进行而不会互相影响(select);写锁(writelock)也叫排他锁(exclusivelock)当前操作没完成之前,会阻塞其它读和写操作(update、insert、delete);默认存储引擎:MyISAM特点1.读锁会阻塞写操作,不会阻塞读操作;2.写锁会阻塞读和写操作;1.对整张表加锁;2.开销小;3.加锁快;4.无死锁;5.锁粒度大,发生锁冲突概率大,并发性低;MyISAM的读写锁调度是写优先,这也是MyISAM不适合做写为主表的引擎,因为写锁以后,其它线程不能做任何操作,大量的更新使查询很难得到锁,从而造成永远阻塞;上锁隐式上锁(

  • 费曼对“掌握、懂得、明白”某件事物或者某个知识的看法

    1、怎样才算搞懂一个问题 怎样才算真的搞懂一个问题? 怎样才算明白一个道理? 怎样才算掌握某个知识? 费曼,超级富有人格魅力的一个人,超级有思想的人。 下面三个视频强推。 【【费曼访谈】“知道”与“理解”的区别】https://b23.tv/WEKIY58 【费曼访谈:磁铁为什么会相互吸引和排斥】https://b23.tv/T6S2hu8 【费曼谈科学与无知】https://b23.tv/wCCGimq 老师们常说,“这个知识点很重要,你们要掌握”,通常这句话中的掌握,得理解成:记住、明白原理、会用、会写、考试能得分。 一般没有问题。 但是在学习某些知识点的初期,我通常都不能“掌握”,我不懂它为什么是这样,为什么就是这样,它到底是怎么来的。 而很多时候,就会被认为是“钻牛角尖”,其实有时真的不是钻牛角尖,而是在我们的认知世界里,我们真的无法理解。 你可能不明白这种感受,我举个例子。 举个我初学计算机网络时的例子。现在某段话告诉你说: “××××××用了‘以太网’技术。” 初学的时候,你知道什么是以太网技术吗? 假如你不懂,然后你去搜,得到解释说: “严格来说,以太网应当是指符合

  • Android SDK content Loader has encountered a problem.parseSdkContent failed

    打开Eclipse,弹出AndroidSDKcontentLoaderhasencounteredaproblem.parseSdkContentfailed,当点击detail按钮,显示parseSdkContentfailedjava.lang.NullPointeException。反正在Eclipse的packageexplorer中的工程一直显示红叉。   这些提示完全是误导人的,从提示上看,是载入SDK出错,导致栈溢出。但重装Eclipse也没用。最后,是通过StackOverFlow上的帖子解决的。它提供的解决方案是查看项目project.properties,看看有没有循环引用,也就是project1引用project2,并且project2应用project1。  这个办法虽然解决了我的问题,但是实际上问题发生的很诡异,我完全没有修改项目的应用,是Eclipse自己抽风在某一个工程中的project.properties添加了引用。 作者:kissazi2 出处:http://www.cnblogs.com/kissazi2/ 本

  • Unity的Destory延迟删除的问题

    由于unity的destroy方法是有延迟的,也就是说他并不是马上就会摧毁,也就是说迩调用destroy方法后,实际上他还是存在的,只是在下一帧的时候,他没了,如果迩是想执行一个操作把某个gameObject的物体下的子物体清空再添加新的子物体的话、先destory再add的方法是不行的、那么我们可以采取先把之前的物体隐藏然后再把它加入一个摧毁的数组里、这样就可以先添加新物体了、然后在添加完子物体后再集中去把摧毁数组里的gameObject都摧毁掉   说白了就是不能在同一帧里,删除一个GameObject,Component又添加一个跟他一样的GameObject,Component   也可以参考这篇文章 http://game.ceeger.com/Script/Object/Object.Destroy.html

  • JedisCluster操作redis集群demo

    packagecom.chenk; importjava.util.HashMap; importjava.util.HashSet; importjava.util.List; importjava.util.Map; importjava.util.Map.Entry; importjava.util.Set; importorg.junit.Before; importorg.junit.Test; importredis.clients.jedis.HostAndPort; importredis.clients.jedis.JedisCluster; importredis.clients.jedis.Tuple; publicclassJedisClusterDemo{ JedisClusterjedis=null; @Before publicvoidconn(){ Set<HostAndPort>nodes=newHashSet<HostAndPort>(); nodes.add(newHostAndPort("192.168.178.1

  • HDU 6630-permutation 2-思维+dp

    转载链接 https://blog.csdn.net/Nothing_but_Fight/article/details/98721177 https://blog.csdn.net/weixin_44751481/article/details/98587703 看完这两篇应该就能搞懂辽~ 这个题目感觉挺难想的,用到了dp,当时理解也理解了很久,所以想着把它给记录下来 ProblemDescriptionYouaregiventhreepositiveintegersN,x,y.Pleasecalculatehowmanypermutationsof1∼Nsatisfiesthefollowingconditions(Wedenotethei-thnumberofapermutationbypi):   p1=x   pN=y   forall1≤i<N,|pi−pi+1|≤2InputThefirstlinecontainsoneintegerTdenotingthenumberofte

  • 类和对象

    main.py: fromuserimportUser frompostimportPost app_user_one=User("nn@nn.com","NanaJanshi","pwd1","DevOpsEngineer") app_user_one.get_user_info() app_user_one.change_job_title('xxx') app_user_one.get_user_info() app_user_two=User("aaa@aa.com","JamesBond","saasd","xxx") app_user_two.get_user_info() new_post=Post("onasecretmissiontoday",app_user_two.name) new_post.get_post_info()复制   user.py: classUser: def__init__(self,user_email,name,password,current_job_title): self.email=user_email s

  • WPF 小技巧

    在使用mvvm模式开发时,对于Command的绑定是一件很伤脑筋的事情,尽管有强大的Blend类库支持: xmlns:Custom="http://www.galasoft.ch/mvvmlight"xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"  xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"  <i:Interaction.Triggers>      <i:EventTriggerEventName="xxx">           <Custom:EventToCommandCommand="{BindingxxxCommand,Mode=OneWay}"/> 

  • 2021年泉州市信息学奥赛集训活动(国庆集训)CSP-S Day1

    破门而入(broken) 题面描述 ​ \(Kiana\)到一个密室中去探险寻宝,该密室中共有\(n\)个房间,每个房间里都有一件独特的宝藏,而她此行的目的就是将所有房间中的宝藏全部取走。 ​ 可惜的是,密室的每个房间门都上了锁,而门锁的钥匙也放在这些房间中,具体来说,第ii号房间内放着第\(a_i\)号房间的门钥匙,每扇门的钥匙有且只有一把,换句话说每个房间内放着的钥匙也是两两不同的。为了进入房间寻宝,\(Kiana\)可以选择直接暴力破开房门,也可以在拿到钥匙之后用钥匙文明地打开房门,但为了防止密室坍塌,\(Kiana\)至多只能使用暴力破开\(k\)扇门。 ​ 聪明的\(Kiana\)计算出,房间中放钥匙的可能情况一共有\(n!\)种,而她想知道其中有多少种情况,使得自己合理选择暴力破开的门后能够最终成功取走所有房间的宝藏。由于\(Kiana\)自己不会算,所以希望你能够帮助她,但最后的答案可能很大,你只需告诉她答案对\(998244353\)取模后的结果即可。 输入输出格式 输入格式 第一行包含两个正整数\(n\)和\(k\),分别表示密室中的房间数和\(Kiana\)使用暴力

  • 数据结构7_链二叉树

    本文实现了二叉树了存储实现,起先决定和队列与栈一样,设计一个二叉树节点的类型classtreeNode,再构建一个二叉树类处理节点的生成,遍历等,结果在做二叉树创建函数CreateBitTree时遇到了很多问题,最后才发现直接构建一个二叉树类型就可以了。这里主要介绍利用先序序列和中序序列重构一个二叉树的函数#include<iostream>#include<math.h>usingnamespacestd;classBitTree{   char*data;   BitTree*lchild,*rchild;   voidpreorder(BitTree*&T); //先序遍历调用函数   voidinorder(BitTree*&T);  //中序遍历调用函数   voidpostorder(BitTree*&T); //后序遍历调用函数publi

相关推荐

推荐阅读