我的代码完成了我想要的操作(仅保存我.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()
我怀疑我的底部写代码部分是需要更改的部分。关于命令的任何想法都会在一个单元格中保留我的单词而不是将其砍掉?在此先感谢您的帮助。
答案 0 :(得分: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)
答案 1 :(得分:1)
问题是数据中的每一行都是一个字符串,但是writerows需要一系列字符串序列。因此,它将每个字符串解释为1个字符的字符串序列。
如果你真的想在每一行写出[0]列,请将每一行列为一个字符串,如下所示:
data.append([column[0]])
如果你想写出列[0]加上其他一些东西......那么不清楚其他东西是什么,但是你将构建一个列[0]和其他东西的列表,并追加那是数据。