python2.7 csv:迭代行并通过附加split()存储在数组中

时间:2013-03-15 20:00:52

标签: python arrays list iteration

我正在试图弄清楚我在循环中的评论是否正确。变量'device'会像我希望的那样是“列表列表”吗?如果是这样,我可以使用设备[0] [0]调用数据吗?或者,说我想要第三行和第二项,请使用设备[2] [1]?

def deviceFile():
    devFile = raw_input('Enter the full file path to your device list file: \n-->')
    open(devFile, 'r')
    device = []
    for line in devFile:
        # creating an array here to hold each line. Call with object[0][0]
        device.append(line.split(','))
    return(device)

编辑:

def deviceFile():
'''This def will be used to retrieve a list of devices that will have
commands sent to it via sendCommands(). The user will need to supply
the full file path to the raw_input(). This file will need to be a csv,
will need to have column0 be the IP address, and column1 be the 
hostname(for file naming purposes). If a hostname is not supplied in
column1, the file will be named with the IP address.'''

devFile = raw_input('Enter the full file path to your device list file: \n-->')
thisFile = open(devFile, 'r')
device = []

for line in thisFile:
    # creating an array here to hold each line. Call with object[0][0]
    device.append(line.split(','))
thisFile.close()
return(device)

这更像是“我在逻辑上这样做”,而不是“我的代码完美”类型的问题。我希望csv的每一行都是它自己的列表,并且能够通过在我的主程序中调用它来访问它:

devices = deviceFile()

machine = devices [0] [0]

返回第一行的第一项

machine = devices [2] [1]

返回第三行的第二项

2 个答案:

答案 0 :(得分:0)

你的问题是你没有对文件对象(open返回的东西)做任何事情,而是尝试对文件名进行操作,就像它是文件对象一样。所以,只需改变这一点:

devFile = raw_input('Enter the full file path to your device list file: \n-->')
open(devPath, 'r')

到此:

devPath = raw_input('Enter the full file path to your device list file: \n-->')
devFile = open(devPath, 'r')

一旦你这样做,它“有效”,但可能不符合你的预期。例如,对于此文件:

abc, def
ghi, jkl

你会得到这个:

[['abc', ' def\n'], ['ghi', ' jkl\n']]

'\n'字符存在,因为for line in devFile:返回保留换行符的行。如果你想摆脱它们,你必须做一些事情,比如rstrip('\n')

空间在那里,因为split不会对空间做任何神奇的事情。您要求它在'abc, def'上拆分',',然后您将返回'abc'' def'。如果你想摆脱它们,strip结果。

您还有其他各种小问题 - 例如,您永远不会关闭文件 - 但它们都不会实际阻止您的代码工作。

所以:

def deviceFile():
    devPath = raw_input('Enter the full file path to your device list file: \n-->')
    devFile = open(devPath, 'r')
    device = []
    for line in devFile:
        # creating an array here to hold each line. Call with object[0][0]
        device.append([value.strip() for value in line.rstrip('\n').split(',')])
    return(device)

现在你将退回:

[['abc', 'def'], ['ghi', 'jkl']]

device.append([value.strip() for value in line.rstrip('\n').split(',')])看起来很复杂。在rstrip之前调用每行split并不是什么大问题,但是对每个值调用strip的列表理解使得它有点难以阅读。如果你不知道列表理解是什么(看起来很可能,因为append列表的device周围有明确的循环),你必须做这样的事情:< / p>

device = []
for line in devFile:
    values = []
    for value in line.rstrip('\n').split(','):
        values.append(value.strip())
    device.append(values)

但是,有一种更简单的方法可以做到这一点。标准库中的csv module使用换行符和空格来处理所有棘手的事情,以及您尚未想到的事情(如引用或转义值)。

def deviceFile():
    devPath = raw_input('Enter the full file path to your device list file: \n-->')
    with open(devPath) as devFile:
        return list(csv.reader(devFile))

答案 1 :(得分:-1)

如果我错了,请纠正我,我认为您正在尝试读取文件,然后将文件中的每一行(用逗号分隔)存储到数组中。例如,如果你有一个简单地说“一,二,三”的文本文件,你想要创建一个数组['one','two','three']?如果是这样,你不需要for循环,只需这样做:

def deviceFile():
    devFile = raw_input('Enter the full file path to your device list file: \n-->')
    myFile = open(devFile, 'r') # Open file in read mode
    readFile = myFile.read() # Read the file

    # Replace enter characters with commas
    readFile = readFile.replace('\n', ',')
    # Split the file by commas, return an array
    return readFile.split(',')

你不需要for循环的原因是因为str.split()已经返回一个数组。事实上,你甚至不需要附加“设备”,你根本不需要设备。有关详细信息,请参阅string documentation