0

我的代码执行我想要的操作(仅保存我的 .csv 中的第一列),但是当我将其写回 .csv 时,每个单元格得到一个字母,而不是第一列中的 all 单词。

def del_col(in_path):
     # read file into memory
        file_obj = open(in_path, 'rb')
        reader = csv.reader(file_obj, delimiter='\t')
        data = []
        for row in reader:
            column = str.split(row[0],',')
            data.append(column[0])
        print row

        file_obj.close()

        conf = raw_input('Delete Status Column? (Y|N): ').upper()[0]

        if conf == 'Y':
            # write data to file
            file_obj = open(in_path, 'wb')
            writer = csv.writer(file_obj)
            writer.writerows(data)
            file_obj.close()

我怀疑我的底部编写代码部分是需要更改的部分。关于将我的话保存在一个单元格中而不是将其切碎的命令的任何想法?在此先感谢您的帮助。

4

2 回答 2

1

writerows需要一个序列列表。对于每个序列,它将序列中的每个条目写入不同的列。你给它一个字符串列表,什么时候得到你想要的行为你应该给它一个字符串列表列表。或元组,无论哪个。

为获得正确行为而对代码进行的最小修改是:

data.append(column[:1])

还有很多其他的东西我会改变,但这应该让它工作。

至于我还要改变什么——你不需要data在写出来之前加载列表的内容。相反,您可以将产生正确内容的迭代器传递给csv.writer类。我看到你在这里重写了输入文件 - 我通常更喜欢在我去的时候写入临时文件,然后在成功时将它移动到磁盘上,或者只是以不同的名称查找输出文件。

此外,在此示例中,您实际上并不需要 csv 编写器,因为您只编写了一列。一个简单的文件句柄也可以。从上下文来看,我假设此示例不完整,并且基于输入,您可能不想删除输入行的某些部分。不过,我不知道您想要为不是“Y”的输入值输出什么。

你的str导入不存在,所以我不能完全确定你用什么调用str.split,但如果它是内置string模块的函数,那大部分已经过时了。相反,split现在是字符串对象的一种方法。

我会这样做:

def del_col(in_path):
    conf = raw_input('Delete Status Column? (Y|N): ').upper()[0]
    out_path = in_path + '.out'
    with open(in_path, 'rb') as input_file, open(out_path, 'wb') as output_file:
        reader = csv.reader(input_file, delimiter='\t')
        if conf == 'Y':
            # no need for a csv writer when writing just a single string per line
            output_file.writelines(row[0].split(',')[0] + '\n' for row in reader)
        else:
            # not sure what you want here; possibly a writer object?
            # actual logic to write the output file goes here in place of the pass
            pass
    os.rename(in_path, in_path + '.input')
    os.rename(out_path, in_path)
于 2013-10-11T22:34:35.707 回答
1

问题是 data 中的每一行都是一个字符串,但是 writerows 需要一个字符串序列。因此,它将每个字符串解释为 1 个字符的字符串序列。

如果您真的只想在每一行上写出 column[0],请将每一行设为一个字符串的列表,如下所示:

data.append([column[0]])

如果你想写出 column[0] 加上其他一些东西......那么不清楚其他东西是什么,但你会用 column[0] 和其他东西构建一个列表,并将其附加到数据.

于 2013-10-11T22:35:57.520 回答