将4添加到列表的元素(我试图转换为整数)

时间:2015-03-17 18:07:34

标签: python csv

如果我文件的每一行的第6个元素是2,我想在同一行上添加4到元素10。我在添加时遇到了问题。

import csv

plusfour=[]
with open("101.txt", 'rb') as f:
    reader = csv.reader(f)
    # make it into a list
    data = list(reader)
    # for each line in data
    dataline = 0
    for i in data:
    if data[dataline][5] is "2":
        plusfour.append(int(data[dataline][9])+4)
        print(plusfour)
        #print(data[dataline][9])
    dataline +=1

但它不会打印任何东西。我也试过

        if data[dataline][5] is "2":
            print(data[dataline][9])

这是有效的,所以问题在于我如何尝试为该值添加4。在将数据[dataline] [9]指定为可添加到的整数时,我无法弄清楚我上面做错了什么。

基本上,如果我的csv中一列的值是2,那么如何将4添加到同一行的另一列的值?我需要遍历每一行。

这是我加载的文件的一部分: input file

这是我的第二个代码段的输出: output of my 2nd code snippet

编辑:我遇到了问题,因为我的一些价值观是空白的。我现在有这个:

import csv

plusfour=[]
# open file with all subjects in it 
with open("101.txt", 'rb') as f:
    reader = csv.reader(f)
    # make it into a list
    data = list(reader)
    # for each line in data
    dataline = 0
    valid_responses = ("1", "2")
for i in data:
    if data[dataline][5] not in valid_responses:
        plusfour.append("NA")
    elif int(float(data[dataline][5])) == 2:
        # add 4 to value of 10th element in same row 
        data[dataline][9] = int (float(data[dataline][9]))+4
        plusfour.append(data[dataline][9])
        print(plusfour)
    elif int(float(data[dataline][5])) == 1:
        plusfour.append(data[dataline][9])
    dataline +=1

我收到此错误:    data [dataline] [9] = int(float(data [dataline] [9]))+ 4 ValueError:无法将字符串转换为float:

3 个答案:

答案 0 :(得分:1)

问题:

根据规则在输入文件中创建新列,以下是一些规则

  1. 如果第5个值为空或不是数字,则可以在新变量中加上“NA”或其他内容。
  2. 如果第5个是第2个,第9个为空或不是数字,则可以在新变量中加上“NA”
  3. 如果第5个是2,第9个是整数,则只需添加4个。
  4. <强> ALGO:

    1. 打开输入文件以进行读取和打开输出文件写入模式。
    2. 迭代输入文件中的每一行,即for row in reader:
    3. 从每行获取第5项。 输入 异常处理
    4. 如果步骤3引发ValueError异常,则将新列值添加为NA,然后写入输出文件并继续,即迭代下一行。
    5. 如果第5项值等于2,则从第3行获得第9项的值。
    6. 使用异常处理进行类型转换以获得第9个项目。
    7. 如果步骤6引发ValueError异常,则将新列值添加为NA,然后写入输出文件并继续,即迭代下一行。
    8. 否则将4添加到第9项的值中并写入输出文件。
    9. 我们可以对其他目标值做同样的事情。
    10. <强>码

      with open("101.txt", 'rb') as fp1:
          reader = csv.reader(fp1)
          #- open output file
          with open('101_output.csv', 'wb') as fp2:
              writer = csv.writer(fp2, delimiter=',')
      
      
          #- Iterate on input files
          for row in reader:
              try:
                  item_5 = int(row[5])
              except ValueError:
                  #- Create copy of row
                  new_row = list(row)
                  #- Append 9th value
                  new_row.append("NA")
                  #- Write row
                  writer.writerow(new_row)
                  print "Error1: Type Casting value %s"%row[5]
                  continue
      
              new_row = list(row)
              if item_5 == 2:
                  # add 4 to value of 10th element in same row 
                  try:
                      item_13 = int(row[9])+4
                      new_row.append(item_13)
                  except ValueError:
                      new_row.append("NA")
              elif item_5 == 1:
                  # keep data[dataline][9] the same
                  try:
                      item_13= int (row[9])+0
                      new_row.append(item_13)
                  except ValueError:
                      new_row.append("NA")
              else:
                  #- add same value of 9th item to 13th item
                  new_row.append(row[9])
              writer.writerow(new_row)
      

答案 1 :(得分:0)

import csv

plusfour=[]
with open("101.txt", 'rb' as f:
    reader = csv.reader(f)
    # make into a list
    data = list(reader)
    # counter
    dataline = 0
    for i in data:
        if int(float(data[dataline][5])) == 2:
            # add 4 to value of 10th element in same row 
            data[dataline][9] = int (float(data[dataline][9]))+4
            plusfour.append(data[dataline][9])
            print(plusfour)
        dataline +=1

答案 2 :(得分:0)

有一点需要注意的是,你是mixing up equality with identity

这一行:

if data[dataline][5] is "2":

dataline[5]的内容与另一个str("2")进行比较,以检查它们是否是相同的对象(标识)。这可能会失败,oyu真正想要的是检查它们是否相等(即,由相同顺序的相同字符组成),所以使用==(相等):

if data[dataline][5] == "2":

另外,请确保您将相同类型"2"str不等于2(int)进行比较。

要确保转换为更常规的类型:

 x = 2
 y = "2"
 x == y # False
 str(x) == str(y) # True