CSV(带有列的子集)

时间:2018-10-26 04:24:10

标签: python csv

编写一个名为“ filter_columns”的函数,该函数将一个字符串作为参数来表示具有5列的CSV文件名,格式为“ string,int,int,int,int”,并写入一个名为“ distant.csv”的文件“,仅包含输入文件中的第一和第五列。

import csv
def filter_columns(csvfile):
    with open(csvfile, 'r') as rf:
        reader = csv.reader(rf)
        with open('distant.csv', 'w') as wf:
            writer = csv.writer(wf)
            for item in reader:
                writer.writerow(item[0] + str(int(item[4])))

输入文件items.csv

bed,7,22,137,157
defender,14,58,185,61

我应该得到

bed,157
defender,61

但是,我得到

b,e,d,1,5,7
d,e,f,e,n,d,e,r,6,1

如何删除不需要的逗号?

4 个答案:

答案 0 :(得分:1)

在文档https://docs.python.org/3/library/csv.html中,csvwrite.writerow带有一个可迭代的参数。

当您写item[0]+str(int(item[4]))时,您正在生成一个字符串,它是一个字符列表。因此,输出类似于d,e,f,e,n,d,e,r,6,1

我可能想尝试:

import csv
def filter_columns(csvfile):
    with open(csvfile, 'r') as rf:
        reader = csv.reader(rf)
        with open('distant.csv', 'w') as wf:
            writer = csv.writer(wf)
            for item in reader:
                print(item)
                writer.writerow([item[0]]+[str(int(item[4]))])

答案 1 :(得分:0)

您需要编辑writerow

writer.writerow([item[0]]+[item[4]])

答案 2 :(得分:0)

您正在将字符串item[0] + str(int(item[4]))传递到writer.writerow。例如,对于您要传递的第一行"bed157",当writer.writerow期望可迭代(例如列表)时,它将把您要传递的字符串转换为[“ b”,“ e”,“ d “,” 1“,” 5“,” 7“]。

您需要传递一个列表/元组:

import csv

def filter_columns(csvfile):
    with open(csvfile, 'r') as rf:
        reader = csv.reader(rf)
        with open('distant.csv', 'w') as wf:
            writer = csv.writer(wf)
            for row in reader:
                writer.writerow([row[0], str(row[4])])

答案 3 :(得分:0)

这对我有用

import csv
def filter_columns (x):
    with open(x, 'r') as f:
        reader = csv.reader(f)
        with open ('museum.csv', 'w') as g:
            writer = csv.writer(g)
            for line in reader:
                writer.writerow((line[0], str(line[2])))