【问题标题】:Python : csv unexpected quotes in last elementPython:csv最后一个元素中的意外引号
【发布时间】:2015-03-07 14:00:53
【问题描述】:

我正在使用 Python 2.7.6 并学习使用 csv 模块。当我将输入文件解析为每行最后一个元素的 CSV 输出文件时,我的脚本以某种方式在最后一个元素之后添加了意外的双引号和几个空格。我无法使用常规替换删除那些双引号。

我可以删除多余的双引号的唯一方法是使用: tmp[1] = tmp[1][:-3]

我不明白在解析输入时如何添加额外的双引号。当输入文件没有双引号时,请告诉我为什么或如何将这些双引号添加到partno。

我的代码:

import re
import csv

fname = "inputfile"
try:
    fhand = open(fname)
except:
    print 'File cannot be opened:', fname
    exit()

domain = []
server = []
model =  []
serial = []
dn = []
memsize = []
vid = []
partno = []
csv_out = open('/tmp/out.csv','wb')
writer = csv.writer(csv_out)

for line in fhand:
    words = line.split("; ")
    tmp_row_list = []
    for number in [0,1,2,3,4,5,6,7]:
        tmp=words[number].split("=")
        if "}" in tmp[1]:
            tmp[1] = tmp[1][:-3]
            #tmp[1] = re.sub('}','', tmp[1])
        if number == 0: domain.append(tmp[1])
        if number == 1: server.append(tmp[1])
        if number == 2: model.append(tmp[1])
        if number == 3: serial.append(tmp[1])
        if number == 4: dn.append(tmp[1])
        if number == 5: memsize.append(tmp[1])
        if number == 6: vid.append(tmp[1])
        if number == 7: partno.append(tmp[1])
    rows = zip(domain,server,model,serial,dn,memsize,vid,partno)
    writer.writerows(rows)
csv_out.close()

输入文件:

ffile:@{Ucs=uname; ServerId=4/6; Model=UCSB-B200-M3; Serial=FCH; AssignedToDn=; TotalMemory=98304; Vid=V06; PartNumber=73-14689-04}
ffile:@{Ucs=uname; ServerId=4/7; Model=UCSB-B200-M3; Serial=FCH; AssignedToDn=; TotalMemory=98304; Vid=V06; PartNumber=73-14689-04}

我的 bad 输出在我不得不删除它们之前有奇怪的双引号(如果用 re.sub 取消该行,带有双引号和额外空格的错误输出将显示在最后字段/元素):

uname,4/6,UCSB-B200-M3,FCH,,98304,V06,"73-14689-04
"
uname,4/7,UCSB-B200-M3,FCH,,98304,V06,"73-14689-04
"

【问题讨论】:

  • 你有一个工作代码; for line in fhand 产生行,包括末尾的换行符;要删除它们,请使用 .rstrip('\n') 或 re.sub('}|\n', ...)。

标签: python regex python-2.7 csv


【解决方案1】:

看起来你可以简化很多。

给定input.txt 为:

ffile:@{Ucs=uname; ServerId=4/6; Model=UCSB-B200-M3; Serial=FCH; AssignedToDn=; TotalMemory=98304; Vid=V06; PartNumber=73-14689-04}
ffile:@{Ucs=uname; ServerId=4/7; Model=UCSB-B200-M3; Serial=FCH; AssignedToDn=; TotalMemory=98304; Vid=V06; PartNumber=73-14689-04}

然后使用以下内容:

import re, csv

get_col_vals = re.compile('(?:\w+)=(.*?)[;}]').findall
with open('input.txt') as fin, open('output.csv', 'wb') as fout:
    csvout = csv.writer(fout, quoting=csv.QUOTE_NONE)
    csvout.writerows(get_col_vals(row) for row in fin)

生成的output.csv 是:

uname,4/6,UCSB-B200-M3,FCH,,98304,V06,73-14689-04
uname,4/7,UCSB-B200-M3,FCH,,98304,V06,73-14689-04

【讨论】:

    猜你喜欢
    • 2020-03-24
    • 2015-07-28
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2019-03-19
    • 2020-05-15
    • 2016-07-14
    • 2023-01-05
    相关资源
    最近更新 更多