如何获取csv行中每个字符串的长度,然后使用它来格式化要捕获的元素数量

时间:2016-03-29 18:10:02

标签: python python-2.7

这是我到目前为止由于某种原因这只会抓住一行。我想要做的是检查所有行以获得每个字符串的长度然后如果字符串长度是< = 8只抓取前8个元素或者如果字符串长度是> = 8抓住前10个元素。任何帮助将不胜感激。

 #example data from Book1.csv

 #hello 
 #thisislongerthaneight
 #whatareyoudoing
 #small



import csv 
import os 
import unicodecsv 

reader = csv.reader(open('Book1.csv', 'rb')) 
writer = csv.writer(open('Book2.csv', 'wb')) 
for row in reader: 
    length = len(row) 
    if length <= 8: 
        newRow = [elem[: 8] 
            for elem in row 
        ] 
    elif length >= 8: 
        newRow = [elem[: 10] 
            for elem in row 
        ] 
    writer.writerow(newRow) 

所以我现在得到的只是这个

 hello 

我想知道的是这个

hello
thisislong
whatareyou
small

1 个答案:

答案 0 :(得分:1)

你不需要csv lib,你每行都有一个字符串,所以只需打开文件,检查每个字符串长度不是行长,切片并写:

with open('Book1.csv') as f, open('Book2.csv'') as out:
      out.writelines(s[:8]+ "\n" if len(s) <= 8 else s[:10]+"\n"
                     for s in map(str.rstrip, f))

您需要删除换行符,因为您必须将它们添加回切片字符串,如果您不能在最后为两个字符少于8个字的单词添加两个换行符。

如果每行有多个单词,并希望将逻辑应用于每个单词:

writer.writerows([s[:8] if len(s) <= 8 else s[:10] for s in row] for row in reader)

两者都会给你:

hello
thisislong
whatareyou
small

使用后者的唯一原因是每行有多个逗号分隔的单词。