0

我试图弄清楚我在循环中的评论是否正确。变量“设备”会像我希望的那样成为“列表列表”吗?如果是这样,我可以使用 device[0][0] 调用数据吗?或者,假设我想要第三行和第二项,使用 device[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 的每一行都是它自己的列表,并且能够通过在我的主程序中调用它来访问它:

设备 = 设备文件()

机器=设备[0][0]

返回第一行的第一项

机器=设备[2][1]

返回第三行的第二项

4

2 回答 2

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每个值的列表理解使它有点难以阅读。如果你不知道什么是列表推导(这似乎很可能,因为你有一个明确appenddevice列表循环),你必须做这样的事情:

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

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

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))
于 2013-03-15T20:44:13.687 回答
-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() 已经返回一个数组。事实上,你甚至不需要附加“设备”,你根本不需要设备。有关更多信息,请参阅字符串文档

于 2013-03-15T20:14:08.657 回答