【问题标题】:CSV File to list要列出的 CSV 文件
【发布时间】:2013-01-09 12:42:59
【问题描述】:

我有一个 CSV 文件,它由第一列中的单词组成。 (每行 1 个单词)

我需要打印这些单词的列表,即

CSV 文件:

a
and
because
have

想要的输出:

"a","and","because","have"

我正在使用 python,到目前为止我有以下代码;

text=open('/Users/jessieinchauspe/Dropbox/Smesh/TMT/zipf.csv')
text1 = ''.join(ch for ch in text)
for word in text1:
    print  '"' + word + '"' +','

这是返回:

"a",
"",
"a",
"n",
...

而我需要一行一行的所有内容,而不是按字符而是按单词。 感谢您的帮助!

编辑:这是 CSV 文件预览的屏幕截图

【问题讨论】:

  • 文件是否总是每行只有一个单词?或者它可能有多个逗号分隔的字段?
  • 你看过python提供的csv库吗?
  • @BenButler-Cole 是的,每行总是一个单词。
  • ''.join(ch for ch in text) 等价于''.join(text)

标签: python list text csv


【解决方案1】:

直接遍历文件即可:

with open('/Users/jessieinchauspe/Dropbox/Smesh/TMT/zipf.csv') as text:
    print ','.join('"{0}"'.format(word.strip()) for word in text)

以上代码:

  • 循环文件;这会给你一行(包括换行符\n 字符)。
  • 使用.strip() 删除单词周围的空格(包括换行符)。
  • 使用.format() 将单词放在引号中('word' 变为'"word"'
  • 使用','.join() 将所有引用的单词连接到一个列表中,中间用逗号分隔。

【讨论】:

  • 我支持这个答案。 :),虽然从技术上讲,.strip() 可以删除的不仅仅是换行符。这可能是需要的,但如果不需要,OP 可以使用word.rstrip('\n') 或简单的切片:word[:-1]
  • 这相当于我的解决方案,而且比我的解决方案好一点。
  • @mgilson:我澄清了一点,我的解释确实不完整。
  • 似乎对我不起作用,返回一长串彼此相邻的所有单词:“aandhaveableaccordinlgy ....”
  • @Julia:你的输入示例给了我"a","and","because","have";要获得您的输出,text 必须已经是一个长字,而不是每行一个字的文件。
【解决方案2】:

当你这样做时: text=open('/Users/jessieinchauspe/Dropbox/Smesh/TMT/zipf.csv') 基本上返回一个迭代器,每行作为一个元素。如果你想要一个列表,并且你确定每行只有一个单词,那么你需要做的就是

  result=list(text)
  print result

否则你只能像这样得到第一个单词:

 result = list(x.split(',')[0] for x in text)
 print result

【讨论】:

  • 这会返回 ["a\rand\rbecause\rhave\r ... \rzero"]
  • 我使用了这个,然后复制到 Word 中并用“,”替换了 \r。
【解决方案3】:

您也可以使用 CSV 模块:

import csv

input_f = '/Users/jessieinchauspe/Dropbox/Smesh/TMT/zipf.csv'
output_f = '/Users/jessieinchauspe/Dropbox/Smesh/TMT/output.csv'

with open(input_f, 'r') as input_handle, open(output_f, 'w') as output_handle:
    writer = csv.writer(output_handle)
    writer.writerow(list(input_handle))

【讨论】:

  • 我想知道为什么writerow 需要一个序列对象而不是任何通用的可迭代对象...
  • @mgilson:现在我想起来,这很奇怪。我得看看是不是这样。
  • 没错。文档说sequence,如果您尝试使用生成器表达式编写一行,则会引发异常。我在上面尝试了inspect.getsourcelines,但是失败得很惨——大概是因为它是一个 C 实现。
  • 我得到以下信息: Traceback(最近一次调用最后一次):writer.writerow(list(input_handle)) IOError: File not open for writing
  • @Julia:哎呀,最后一个'r' 应该是'w'
【解决方案4】:

如果您在打印语句的末尾放置一个逗号,它会禁止换行。

print  '"' + word + '"' +',',

将在一行上为您提供输出。

【讨论】:

  • OP 也需要删除 text1 = ''.join(ch for ch in text)
  • 此解决方案在行尾多加一个逗号。
  • 这正是我需要的,但它认为每个字符都是一个单独的单词:"、"t"、"l"、"y"、""、"c"、"o" 、“n”、“s”、“i”、“d”、“e”、“r”、“”
【解决方案5】:

print ','.join('"%s"' % line.strip() for line in open('/tmp/test'))

【讨论】:

  • 似乎不起作用,返回所有单词的长字符串:“aandbecausehaveaccordingly ....”
猜你喜欢
  • 1970-01-01
  • 2013-10-24
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多