将Python文件拆分为列表

3
我可以帮您翻译成中文。这段代码似乎存在问题,它能够成功地分割文件,但是只返回了一个元素。
函数如下:
def splitRoute():
  route = []
  for line in open("route.txt","r").readlines():
    line = line.replace("\r","")
    line = line.replace("\n","")
    line = string.split(line, '>')
    route.append(line) 
  return route

输出:

[['B', 'F']]

route.txt 内容:

B>F

它只返回一个元素,是因为文件中只有一行吗?我有另一个函数可以将另一个文件拆分成一个7x7的列表,它能正常工作,但这只是因为它有7行所有才涵盖了所有七个元素吗?

你还期待着什么? - Karl Knechtel
2个回答

3
为什么要替换换行符?直接用字符串分割即可:
def splitRoute():
  route = []

  for line in open('route.txt', 'r'):
    route.append(line.strip().split('>')) 

  return route

1
@Schmooo,每次使用+时它也会创建一个新的列表副本。我建议使用extend而不是append;这样你就完全不需要使用sum了。 - senderle
我刚意识到如果route.txt是多行的话它就不起作用了。它会将文件中的所有行添加到列表的一行中。我需要将其拆分为二维数组,这样对于一个三行文件来说应该是2x3的形式。 - Thomas Mitchell

1

split创建一个列表。然后,您将该列表append到另一个(空)列表中。因此,结果是您获得了一个列表内的列表。如果您有更多行,则会得到一个更长的列表。

以下是代码的快速分解:

def splitRoute():
  route = []

你创建一个空列表...

  for line in open("route.txt","r").readlines():
    line = line.replace("\r","")
    line = line.replace("\n","")

对于每一行,您需要将 \r 和 \n 字符替换为空字符串。请注意,您可以更轻松地使用 line.strip()'apple\n\r'.strip() -> 'apple')来完成此操作。此外,您应该将文件保存到一个文件名中,以便稍后关闭它。最后,在这里您不需要使用 readlines -- 直接迭代文件即可。

    line = string.split(line, '>')

现在你需要将line所引用的字符串拆分成一个列表,并将该列表赋值给line。现在line看起来像这样:['B', 'F']
    route.append(line) 
    return route

现在你已经将line添加到route中,route看起来是这样的:[['B', 'F']]
如果你的目标是创建一个单一的列表,请使用extend而不是append
def splitRoute():
  route = []
  f = open('route.txt', 'r')
  for line in f:
    route.extend(line.strip().split('>'))
  f.close()
  return route

或者,使用 with,并采用更易读的缩进级别:

def splitRoute():
    route = []
    with open('route.txt', 'r') as f:
        for line in f:
            route.extend(line.strip().split('>'))
    return route

输出一个有两行的文件('B>F\nF>X\n'):

>>> splitRoute()
['B', 'F', 'F', 'X']

我需要在列表中嵌套一个列表才能将其变为二维数组,还是说有没有一种方法只用一个列表就可以实现这个目的? - Thomas Mitchell
如果你想要一个二维数组,使用append而不是extend。在Python中创建二维数组最直接的方法确实是创建一个列表的列表。你也可以使用元组来索引字典;d = {}; d[0, 0] = 1; d[0, 1] = 0; d[1, 0] = 1; d[1, 1] = 0等等。但在大多数情况下,这比列表的列表略慢。 - senderle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接