如何从python脚本读取csv文件?

大家好, 我想通过我的Python脚本阅读CSV文件的内容. CSV文件说n行,每行包含一些逗号分隔的数字. 我必须单独访问特定行,然后分别访问所有数字. 对于ex:CSV文件就是这样: 1 01,02,05,07,18 2 00.01,04 3 09,20,21 现在,第一个数字是该行的数字,将作为输入thru命令行args提供. 我想获得以下行号之后的数字...即,对于第1行,我想获得01,02,05,07,18不是一条完整的行,而是单独的数字. 请帮助

# 回答1

由于您的数据在行号之后具有很大的空白空间,因此您可以在空白上使用split(). 例如

选择 | 换行 | 行号
  1. >>> for line in open("file"):
  2. ...  line = line.strip().split()
  3. ...  print "row:  ", line[0] , line[1:][0].split(",")
  4. ...
  5. row:   1 ['01', '02', '05', '07', '18']
  6. row:   2 ['00.01', '04']
  7. row:   3 ['09', '20', '21']
  8.  
# 回答2

我的朋友ghostdog74实际上是从行号开始的,并且条目之间没有空格,则有一个很好的解决方案. 真正的CSV文件的格式更像: 1st_value,2nd_value等 对于此类文件,CSV模块也可能是一个不错的选择.
# 回答3

实际上情况有点不同. CSV文件中有几行,每一行从唯一的数字开始,然后是另一组数字. 正如我在上一篇文章中所说的那样. 我必须访问特定的行及其之后的数字.
# 回答4

巴顿是正确的. 这不是一个真正的CSV文件. 只要数据一致,这应该有效:

选择 | 换行 | 行号
  1. '''
  2. 1 01,02,05,07,18
  3. 2 00,01,04
  4. 3 09,20,21
  5. 4 12,34,56,77,88,99
  6. 5 03,05,77,88,54
  7. '''
  8.  
  9. def file_data1(f):
  10.     dd = {}
  11.     for line in f:
  12.         dd[int(line.split()[0])] = [int(i) for i in line.split()[1].split(',')]
  13.     return dd        
  14.  
  15. dd = file_data1(open('your_file').readlines())
  16. for key in dd:
  17.     print '%s = %s' % (key, dd[key])
  18.  
  19. '''
  20. >>> 1 = [1, 2, 5, 7, 18]
  21. 2 = [0, 1, 4]
  22. 3 = [9, 20, 21]
  23. 4 = [12, 34, 56, 77, 88, 99]
  24. 5 = [3, 5, 77, 88, 54]
  25. '''

>>>因为我在DD [5]中: ...打印我, ... 3 5 77 88 54 >>>

# 回答5

因此,您想从命令行参数获得输入,尝试这样的事情

选择 | 换行 | 行号
  1. import sys
  2. choice = sys.argv[1]
  3. for line in open("file"):
  4.      line = line.strip().split()
  5.      if choice == line[0]
  6.           print line[1:][0].split(",")
  7.  
# 回答6

sry但是这个果酱工作...它没有打印好! :(
# 回答7

我执行了代码,但显示了以下错误: Trackback(最近的最新电话): 文件"",第1行,在? 文件"",第4行,在file_data中 ValueError:Int()的文字无效:
# 回答8

看起来错误消息的一部分丢失... 您需要粘贴实际数据的副本. BV的代码不是问题.
# 回答9

我粘贴了整个错误消息... 实际的CSV文件看起来像这样: 单个补丁列表 1 00; 01; 2 00; 3 01; 4 02; 5 00; 01; 02; 6 01; 02; 7 01; 02; 03; 04; 05; 8 01; 02; 03; 04; 05; 06; 9 00; 01; 02; 03; 05; 10 01; 02; 03; 05; 11 02; 03; 05; 06; 12 04; 13 01; 02; 03; 05; 08; 09; 14 00; 01; 02; 03; 05; 09; 15 00; 01; 02; 03; 05; 09; 10; 10; 16 01; 02; 03; 05; 08; 09; 10; 17 01; 02; 03; 05; 08; 10; 18 08; 19 00; 01; 02; 03; 05; 08; 09; 10; 10; 20 02; 03; 05; 06; 08; 10; 21 11; 22 12; 23 11; 12; 24 00; 01; 02; 03; 05; 14; 我将最左边的数字作为输入,并取决于数字..我必须获取以下数字列表. 请帮助
# 回答10

您最初说您的数据中有逗号,因此人们写了寻找逗号的功能:

选择 | 换行 | 行号
  1. def file_data1(f):
  2.     dd = {}
  3.     for line in f:
  4.         dd[int(line.split()[0])] = [int(i) for i in line.split()[1].split(',')]
  5.     return dd        
  6.  

您在上述功能中看到逗号吗? 您的数据具有半色调,因此您需要将其更改为:

选择 | 换行 | 行号
  1. def file_data1(f):
  2.     dd = {}
  3.     for line in f:
  4.         dd[int(line.split()[0])] = [int(i) for i in line.split()[1].split(';')] # chaned here
  5.     return dd        
  6.  

感谢您,BV,提供原始功能.

# 回答11

现在,一旦我键入该行: dd = file_data(open('my_file').readlines()) 它显示以下错误:

选择 | 换行 | 行号
  1. Traceback (most recent call last):
  2.   File "<stdin>", line 1, in ?
  3.   File "<stdin>", line 4, in file_dat
  4. IndexError: list index out of range
  5.  
# 回答12

它确实有效

选择 | 换行 | 行号
  1. import sys
  2. choice = sys.argv[1]
  3. for line in open("file"):
  4.      line = line.strip().split()
  5.      if choice == line[0]:
  6.           print line[1:][0].split(";")
  7.  

Outpu t:

选择 | 换行 | 行号
  1. # ./test.py 23
  2. ['11', '12', '']
  3.  

请注意,您的CSV文件现在已结肠分离,而不是分离逗号. 因此,您必须更改split()语句.

# 回答13

现在,一旦我键入该行: dd = file_data(open('my_file').readlines()) 它显示以下错误:

选择 | 换行 | 行号
  1. Traceback (most recent call last):
  2.   File "<stdin>", line 1, in ?
  3.   File "<stdin>", line 4, in file_data
  4. ValueError: invalid literal for int(): Of
  5.  

[/引用]

# 回答14

请忽略上述错误. 我在命名该变量时犯了一些错误. 当我键入以下行时,错误实际上与以前相同: dd = file_data(open('my_file').readlines())

选择 | 换行 | 行号
  1. Traceback (most recent call last):
  2. File "<stdin>", line 1, in ?
  3. File "<stdin>", line 4, in file_data
  4. ValueError: invalid literal for int(): Of
  5.  
# 回答15

即使现在,它都可以工作. 让我告诉你我做的: 1)创建一个新文件 2)编写以下代码:

选择 | 换行 | 行号
  1. import os
  2. import sys
  3. import csv
  4.  
  5. def main(argv):
  6.  
  7.     choice = sys.argv[1]
  8.     fp = open("c:\pst\pst_modified\log_4_0.csv",'r')
  9.     for line in fp:
  10.      line = line.strip().split()
  11.      if choice == line[0]:
  12.           print line[1:][0].split(";")
  13.  

3)我在系统上安装了Python23 4)打开命令提示 5)移至放置新的目录的目录 6)执行以下命令 python new.py'23' 我错了吗? . 不是有效的命令.

# 回答16

尝试这个:

选择 | 换行 | 行号
  1. import os
  2. import sys
  3. import csv ## you are not using this?
  4.  
  5. filepath = os.path.join("C:\\","pst","pst_modified","log_4_0.csv")
  6.  
  7. def main():
  8.     choice = sys.argv[1]    
  9.     for line in open(filepath):
  10.      line = line.strip().split()
  11.      if choice == line[0]:
  12.           print line[1:][0].split(";")
  13.  
  14. main()  ## < --you did not call the main in your last posted script sample.
  15.  
# 回答17

你好, 它仍然不起作用. 如果您在 line = line.strip().split() 您会打印整个CSV文件并到达末端. 当u将选择与行[0]进行比较之后...条件不满足,因为[0]包含CSV文件的最后一行.
# 回答18

请尝试此调试方法:

选择 | 换行 | 行号
  1. def main():
  2.     choice = sys.argv[1]    
  3.     for line in open(filepath):
  4.      line = line.strip().split()
  5.      print line, type(line), line[0], line[1]
  6.      raw_input("Press to continue: " )
  7.      if choice == line[0]:
  8.           print line[1:][0].split(";")
  9. main()
  10.  

请显示上述输出.

# 回答19

代码的输出如下:

选择 | 换行 | 行号
  1. [',List', 'Of', 'Individual', 'Patches'] <type 'list'> ,List Of
  2. Press to continue:
  3. ['1,00;01;'] <type 'list'> 1,00;01;
  4. Traceback (most recent call last):
  5.   File "<stdin>", line 1, in ?
  6.   File "my.py", line 12, in main
  7.     print line, type(line), line[0], line[1]
  8. IndexError: list index out of range
  9.  
# 回答20

嘿...您的原始样本就是这样:

选择 | 换行 | 行号
  1. List Of Individual Patches
  2. 1 00;01;
  3. 2 00;
  4. 3 01;
  5. 4 02;
  6. 5 00;01;02;
  7. 6 01;02;
  8. 7 01;02;03;04;05;
  9. 8 01;02;03;04;05;06;
  10. 9 00;01;02;03;05;
  11. 10 01;02;03;05;
  12. 11 02;03;05;06;
  13. 12 04;
  14. 13 01;02;03;05;08;09;
  15. 14 00;01;02;03;05;09;
  16. 15 00;01;02;03;05;09;10;
  17. 16 01;02;03;05;08;09;10;
  18. 17 01;02;03;05;08;10;
  19. 18 08;
  20. 19 00;01;02;03;05;08;09;10;
  21. 20 02;03;05;06;08;10;
  22. 21 11;
  23. 22 12;
  24. 23 11;12;
  25. 24 00;01;02;03;05;14;
  26.  

因此,如果您已将格式更改为喜欢:

选择 | 换行 | 行号
  1. 1,00;01;
  2. 2,00;
  3. ...
  4. ..
  5.  

然后肯定是行不通的. 您必须修改代码. 我给您提示在哪里更改:

选择 | 换行 | 行号
  1. ....
  2.     for line in open(filepath):
  3.      line = line.strip().split()  <---here.
  4. ....
  5.  
# 回答21

我没有更改格式. 我的CSV文件与以前相同.仅此而已: 单个补丁列表 1 00; 01; 2 00; 3 01; 4 02; 5 00; 01; 02; 6 01; 02; 7 01; 02; 03; 04; 05; 8 01; 02; 03; 04; 05; 06; 9 00; 01; 02; 03; 05; 10 01; 02; 03; 05; 11 02; 03; 05; 06; 12 04; 13 01; 02; 03; 05; 08; 09; 14 00; 01; 02; 03; 05; 09; 15 00; 01; 02; 03; 05; 09; 10; 10; 16 01; 02; 03; 05; 08; 09; 10; 17 01; 02; 03; 05; 08; 10; 18 08; 19 00; 01; 02; 03; 05; 08; 09; 10; 10; 20 02; 03; 05; 06; 08; 10; 21 11; 22 12; 23 11; 12; 24 00; 01; 02; 03; 05; 14; 25 00; 01; 02; 03; 05; 09; 14; 26 00; 01; 02; 03; 05; 08; 09; 10; 10; 14; 27 00; 01; 02; 03; 05; 17; 28 00; 01; 02; 03; 05; 09; 17; 29 00; 01; 02; 03; 05; 08; 09; 10; 10; 17; 30 01; 02; 03; 05; 08; 09; 10; 17; 31 00; 01; 02; 03; 05; 09; 18; 32 01; 02; 03; 05; 08; 09; 10; 18; 在执行UR代码段之后,我收到了我在上一篇文章中发布的错误消息. 从逗号来的输出中的邓诺(Dunno).
# 回答22

看看您以前遇到的错误:

选择 | 换行 | 行号
  1. [',List', 'Of', 'Individual', 'Patches'] <type 'list'> ,List Of
  2. Press to continue:
  3. ['1,00;01;'] <type 'list'> 1,00;01;
  4. Traceback (most recent call last):
  5.   File "<stdin>", line 1, in ?
  6.   File "my.py", line 12, in main
  7.     print line, type(line), line[0], line[1]
  8. IndexError: list index out of range
  9.  

Follwing输出线从"打印行,类型(线),行[0],行[1]"陈述:

选择 | 换行 | 行号
  1. ...
  2. ['1,00;01;'] <type 'list'> 1,00;01;
  3. ...
  4.  

拆分后的"线"值是['1,00; 01;']. 这意味着它根本没有分裂. 此外,line.strip().split()在空白上拆分,并且由于您的数据现在有一个逗号,因此无能为力. 注意第一个" 1"之后的""? 这就是为什么我推论您的CSV格式不同. 如果否则,我一点都不知道.

选择 | 换行 | 行号
  1. ...
  2. line = line.strip().split(",")
  3. ...
  4.  
# 回答23

嘿,我 这次工作. 万分感谢!! :)
# 回答24

所以毕竟这是您的CSV格式吗?
# 回答25

Dint得到您的问题. 我只是包括这条线

选择 | 换行 | 行号
  1. line = line.strip().split(",")
  2.  

代替这个

选择 | 换行 | 行号
  1. line = line.strip().split()
  2.  
# 回答26

如果通过在逗号上进行拆分并有效,则意味着您的CSV文件有逗号,对吗? 这就是为什么我问您这样的CSV格式:

选择 | 换行 | 行号
  1. 1,00;01;
  2. 2,00;
  3. ....
  4. ...
  5.  

如果不是这样,那么逗号上的分裂将不起作用.

# 回答27

好的...现在我明白了! 非常感谢!!

标签: python

添加新评论