我正在使用CSV模块读取制表符分隔文件.代码如下:
z = csv.reader(open('/home/rv/ncbi-blast-2.2.23+/db/output.blast'), delimiter='\t')
Run Code Online (Sandbox Code Playgroud)
但是当我将Z.close()添加到我的脚本结尾时,我得到并且错误声明"csv.reader'对象没有属性'close'"
z.close()
Run Code Online (Sandbox Code Playgroud)
那我怎么关闭"Z"?
在我的Windows框中,我通常在python 2中执行此操作来编写csv文件:
import csv
f = open("out.csv","wb")
cr = csv.writer(f,delimiter=';')
cr.writerow(["a","b","c"])
f.close()
Run Code Online (Sandbox Code Playgroud)
既然python 3禁止将文本文件写为二进制文件,那么这段代码就不再起作用了.这样可行:
import csv
f = open("out.csv","w",newline='')
cr = csv.writer(f,delimiter=';')
cr.writerow(["a","b","c"])
f.close()
Run Code Online (Sandbox Code Playgroud)
问题是:newlinePython 2不知道参数.
当然,省略换行会导致csv文件中包含太多\r字符,因此无法接受.
我目前正在执行向后兼容的过程,逐步从python 2迁移到python 3.5我的所有模块中都有很多这些语句.
我的解决方案是将代码嵌入到自定义模块中,自定义模块返回文件处理程序+编写器对象.在模块内部进行python版本检查,允许使用我的模块的任何模块在没有太多黑客攻击的情况下使用任何python版本.
有没有更好的办法?
我有一个包含多个条目的CSV文件.示例csv:
user, phone, email
joe, 123, joe@x.com
mary, 456, mary@x.com
ed, 123, ed@x.com
Run Code Online (Sandbox Code Playgroud)
我正在尝试通过CSV中的特定列删除重复项,但是下面的代码我得到的"列表索引超出范围".我想通过比较row[1]与 newrows[1]我会找到所有重复,只改写的唯一条目file2.csv.这不起作用,我不明白为什么.
f1 = csv.reader(open('file1.csv', 'rb'))
newrows = []
for row in f1:
if row[1] not in newrows[1]:
newrows.append(row)
writer = csv.writer(open("file2.csv", "wb"))
writer.writerows(newrows)
Run Code Online (Sandbox Code Playgroud)
我的最终结果是有一个列表来维护文件的顺序(set不会工作......对吗?),它应该是这样的:
user, phone, email
joe, 123, joe@x.com
mary, 456, mary@x.com
Run Code Online (Sandbox Code Playgroud)