【问题标题】:Pythonic way of reading text file using Swift使用 Swift 读取文本文件的 Pythonic 方式
【发布时间】:2015-03-17 02:43:17
【问题描述】:

我知道 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 没有成员名称 stringWithContentsOfFile”

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

我的问题是如何读取文本文件,以便您可以遍历这些行

读完文件后,我可以:

for line in in_file
    {
    println(line)
    }

【问题讨论】:

  • FWIW,这在 Python 中是一种糟糕的方式。你应该使用with open(path) as file: for line in file: print line;您的版本既不惰性也不关闭文件。
  • 我没有用过 Swift 但我想你想要stackoverflow.com/questions/24581517/…。实际上,读完之后我很确定我永远不会打算使用 Swift...
  • @veedrac 会关闭它还是我需要 file.close() 之后?
  • with 将为您关闭它。
  • @Veedrac 感谢您的提醒。我确信 Swift 真的很烦人,但我想制作应用程序,我觉得重新创建我的生物信息 Python 脚本将是学习使用 Swift 的第一步。

标签: python file cocoa parsing swift


【解决方案1】:

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

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

【讨论】:

  • for var strs = NSString(data:data,encoding NSUTF8StringEncoding) 我收到一个错误,告诉我在编码后添加一个 , 。当我添加时,它说“使用未解析的标识符'编码'”
  • 它还让我添加了一个!在第 3 行的 NSData 之后
  • 更正了答案中的错误
  • 当我进行更改时,第 3 行出现错误“执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_l386_INVOP, subcode=0x0)。” .我会试着弄清楚这个错误是什么意思。
  • 我在 Xcode 中运行它并得到了一些奇怪的东西,但它在终端中完美运行
【解决方案2】:

寻找一种 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 应用程序所抵消。

【讨论】:

  • 我觉得它几乎可以工作了,但它显示“无法打开文件“test”,因为您没有查看它的权限。”所以我进入终端并 chmod 777 test.txt ......所以现在我的权限是“-rwxrwxrwx@ 1 Mu staff 48 Mar 15 03:41 test.txt”但我仍然收到那个错误。这么奇怪?
  • 您在哪里执行此操作 - 游乐场、Cocoa 应用程序或命令行应用程序?
  • 我认为游乐场是沙盒,这意味着它们限制了您可以与文件系统交互的程度。这是 Apple 强加的安全问题,这可能是您的代码失败的原因。更重要的是,我怀疑您能否在操场上获取系统上的任何文件。在命令行应用程序中试一试代码;如果它有效,您就会知道问题出在哪里。
  • 你是对的。我通过终端运行它并且它工作。太感谢了。我需要查找您使用的一些语法...“if let contentsString”以及错误检查方法对我来说是不熟悉的。
【解决方案3】:

我正在寻找同样的东西,并找到了以下解决方案。唯一的缺点是文件不是逐行读取,而是一次读取,然后分成几行。这个答案比公认的要短一些,因此对我来说似乎更像“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 版测试)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-24
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2016-11-05
    相关资源
    最近更新 更多