Python合并两行并创建新行的CSV文件

0 投票
4 回答
2410 浏览
提问于 2025-04-18 16:45
#!c:/users/jon/python
#Python 2.7.6

import csv
from string import maketrans

intab = "()-/"
outtab = "    "
tab0 = maketrans(intab, outtab)

plist1 = []
x1 = ''

with open('o:/p1.csv', 'rb') as f1:
    csvfile1 = csv.reader(f1)
    next(f1)
    for row in csvfile1:

        row[0] = row[0].translate(tab0).replace(' ','')
        row[1] = row[1].translate(tab0).replace(' ','')
        x1 = row[0] + '-' + row[1]

        plist1.append(x1)
f1.close()

print str(x1)
#   prints correctly:
#   AAA1111111-BBB2222222

newcsv1 = csv.writer(open('newcsv1.csv', 'wb'))
for row in plist1:
    newcsv1.writerow(row)

#   creates a csv file that looks like below:
#   A,A,A,1,1,1,1,1,1,1,-,B,B,B,2,2,2,2,2,2,2

我希望有人能给我指个方向...

我想创建一个变量,这个变量将把 row[0] 和 row[1] 这两项用一个 '-' 连接起来,然后生成一个新的 csv 文件,这个文件只包含这个新变量。

我正在处理的 csv 文件大致如下:

phone#1,phone#2,phone#3,phone#4
(AAA)111/1111,(BBB)222-2222,(CCC)333/3333,(DDD)444-4444

我希望新的 csv 文件只包含一个单元格/值,如下所示:

AAA1111111-BBB2222222

4 个回答

-1

你想得太复杂了。CSV文件就像其他文件一样,所以这样做是可以的:

with open('newcsv1.csv', 'w') as newcsv1:
    newcsv1.write(str(x1) + '\n')
0

补充一下Padraic的回答——你传递的是一个字符串,而字符串也是一种可迭代的东西。看看这个:

>>> s = "abcd"
>>> for i in s:
...   print i,
... 
a b c d
0
newcsv1 = csv.writer(open('newcsv1.csv', 'wb'))
for row in plist1:
    newcsv1.writerow([row]) # put row inside a list

writerow 这个函数需要一个可迭代的对象,也就是说它需要一个可以逐个取出元素的东西。而你传入的 plist1 的一行是一个字符串,所以 writer 会把这个字符串当成一个个字符来处理,写入文件时就会把它拆分成单个字符。

如果 plist 是一个只有一个元素的列表,你只需要这样做:

newcsv1.writerow(plist1)

这样就会把 AAA1111111-BBB2222222 写入你的文件。

使用你的代码:

with open("newcsv1.csv") as f:
    next(f)
    csvfile1 = csv.reader(f)
    for row in csvfile1:
        print row
        row[0] = row[0].translate(tab0).replace(' ','')
        row[1] = row[1].translate(tab0).replace(' ','')
        x1 = row[0] + '-' + row[1]
        row[2] = row[2].translate(tab0).replace(' ','')
        row[3] = row[3].translate(tab0).replace(' ','')
        x2 = row[2] + '-' + row[3]
        plist1.append([x1]) # append inside a list
        plist1.append([x2])
newcsv1 = csv.writer(open('newcsv1.csv', 'wb'))
newcsv1.writerows(plist1) # write all rows from the list
0

我觉得你把一个简单的问题搞得很复杂了。根据问题,我会这样做,而不是按照你的代码:

from string import maketrans

tab = maketrans("()-/", "    ")
with open("o:/p1.csv", "rb") as fi:
    with open("output.csv", "wb") as fo:
        fi.readline() # skip first line
        for line in fi:
            line = line.translate(tab).replace(" ", "")
            newvals = line.split(",")
            newrow = newvals[0] + '-' + newvals[1] + '\n'
            fo.write(newrow)

我对csvfile模块不太熟悉,所以那里可能还有改进的空间。不过,我觉得你的代码应该可以简单到这个程度,甚至更简单。

撰写回答