使用 Swift 读取文本文件的 Pythonic 方式

Pythonic way of reading text file using Swift

我知道 Python 并且我正在努力学习 Swift...我正在尝试弄清楚如何从绝对文件路径读取纯文本文件

在Python,

#!/usr/bin/python

path= '/users/mu/desktop/test_file.txt'    
in_file= open(path,'w').read() #Open the file for reading

for line in in_file.split('\n'): #Split it by line breaks and print the lines
    print line

试过这个:Swift - Read Files 得到:"String.Type does not have a member name stringWithContentsOfFile"

在Python,就是这么简单。必须有一种非常简单的方法来读取文本文件并创建由换行符分隔的字符串列表。

我的问题是如何读取文本文件以便遍历行

阅读文件后,我可以:

for line in in_file
    {
    println(line)
    }

您可以使用 NSFileManager 和 NSString 来解析行 例如:

    var path = "somePath"
    let fileManager = NSFileManager.defaultManager()
    let data:NSData = fileManager.contentsAtPath(path)!
    var strs = NSString(data: data, encoding: NSUTF8StringEncoding)

寻找一种 pythonic 的方式来用非 Python 的语言做某事通常注定要失败。结合各种标准库,Python 的字符串处理能力远远超过 Swift,您只需要习惯即可。然而,在最简单的情况下,从文件中解析行仍然非常简单。有很多方法可以做到这一点,但是一旦您获得了字符串,下面的方法就可以在一次调用中完成它:

import Foundation
import Cocoa

let filepath = "/Users/yourname/Desktop/greatspeeches.txt"

// 1. Safely load the string
var error: NSError?
let contents = NSString(contentsOfFile: filepath,
    encoding: NSUTF8StringEncoding,
    error: &error)

if let contentsString = contents {

    // 2. Enumerate the lines in the string
    contentsString.enumerateLinesUsingBlock({ (line, stopEarly) -> Void in
        println(line)
    })

} else if let err = error {

    println(err.localizedDescription)

}

和您一样,我也是从 Python 来到 Objective-C/Swift,最初对上述任务的明显难度感到沮丧。不过,一旦您习惯了它,这里遇到的不便就会被轻松地抵消,因为您可以将复杂的 Mac 应用程序组合在一起。

我在搜索同样的东西并找到了以下解决方案。唯一的缺点是文件不是逐行读取,而是一次读取,然后分成几行。这个答案比接受的答案短一点,因此对我来说似乎更 "python"。

import Foundation
let fileName = "file.txt"

let fileContents = try! String(contentsOfFile:fileName)
let lines = fileContents.components(separatedBy: "\n")

for line in lines {
   print(line)
}

这在终端中运行良好(使用 Swift 版本 3.0.2 测试)。