Python脚本读取csv文件
Python脚本读取csv文件
以上所有内容都是从一个Excel表格中提取的值,转换为CSV格式后显示的内容。
正如您注意到的,标题包含七个列,下面的数据会有所变化。
我有一个Python脚本来生成这些内容,脚本如下:
从django.db导入交易
导入sys
导入CSV
导入StringIO
文件= sys.argv[1]
no_cols_flag=0
旗标=0
header_arr=[]
打印文件
f = 打开(文件,'r')
while(f.readline()!=“”):
对于i in [line.split(',') for line in open(file)]:#在分隔符上拆分
打印"==========================================================="
row_flag=0
row_d=""
对于j在i中:#对于拆分字符串中的每个令牌
row_flag=1
打印j
如果j:
no_cols_flag=no_cols_flag+1
数据=j.strip()
打印j
打破
如何修改上述脚本以表明此数据属于特定的列标题...
谢谢...
Python脚本读取csv文件的问题是什么以及解决方法是什么?
问题:你导入了csv模块,但是从未使用过。为什么?
解决方法:如果你这样做
import csv reader = csv.reader(open(file, "rb"), dialect="excel") # Python 2.x # Python 3: reader = csv.reader(open(file, newline=""), dialect="excel")
你会得到一个包含你所需内容的reader对象;第一行将包含标题,而后续行将包含相应位置的数据。
更好的方法可能是(如果我理解你的意思的话):
import csv reader = csv.DictReader(open(file, "rb"), dialect="excel") # Python 2.x # Python 3: reader = csv.DictReader(open(file, newline=""), dialect="excel")
这个DictReader可以被迭代,返回一系列使用列标题作为键和后续数据作为值的字典,所以
for row in reader: print(row)
将输出
{'Name': 'Nick', 'Designation': 'F4321', 'Type': 'Subject', 'Total': '29', 'First-term assessment': '10', 'Second-term assessment': '19', 'Description': 'D1234'} {'Name': 'HTML', 'Designation': 'F4321', 'Type': 'Unit', 'Total': '', 'First-term assessment': '18', 'Second-term assessment': '', 'Description': 'D1234-1'} {'Name': 'Tags', 'Designation': 'F4321', 'Type': 'Topic', 'Total': '', 'First-term assessment': '18', 'Second-term assessment': '', 'Description': 'First Term'} {'Name': 'Review of representation of HTML', 'Designation': '', 'Type': 'Subtopic', 'Total': '', 'First-term assessment': '', 'Second-term assessment': '', 'Description': ''}
在Python 2.x中,始终以二进制模式打开文件(根据需要使用'rb'或'wb')。
Machin:为什么?csv模块文档中没有提到这一点,而且我从未遇到过未带有标志的打开文件的问题。有些示例使用它,有些则不使用。你可能是对的,但我想知道这背后的原因。
解释:2.x文档docs.python.org/library/csv.html#csv.reader中有这样的说明:"如果csvfile是一个文件对象,在那些有区别的平台上,它必须以'b'标志打开。",例如Windows平台。因此为了平台独立性,应该始终使用'rb'。尽管文档没有提到,但在写入时也是同样的情况。CSV记录以CRLF结束,与平台无关 -- 本质上是一种二进制格式。如果在Windows上不提供'wb',将得到CRCRLF。
Machin:可能是我看漏了(我只在页面中搜索了rb
),谢谢。我会进行编辑。