【问题标题】:Simple way to read local file using Swift?使用 Swift 读取本地文件的简单方法?
【发布时间】:2016-11-05 10:19:39
【问题描述】:

我正在努力学习新的 Swift 编程语言。它看起来很棒,但我很难做一些简单的事情,比如读取本地 .txt 文件的内容。

我尝试了一些可以通过 Google 找到的示例,但它们给出了编译错误,就像这里的答案:Read and write data from text file 如果我稍微调整一下代码,它可以工作,但只能从项目中的特殊位置读取。

为什么使用 Swift 读取 .txt 文件不像使用 Ruby 那样简单?我将如何阅读位于~/file.txt 的文件的内容?

谢谢

【问题讨论】:

    标签: swift


    【解决方案1】:

    filename 不需要像file:// 这样的scheme,可以像../docs/test.txt 这样是相对的。

    记得catch 抛出任何错误,或重新抛出。

    let url = URL(fileURLWithPath: filename)
    let contents = try String(contentsOf: url, encoding: .utf8)
    

    【讨论】:

      【解决方案2】:
          let file = "/Users/user/Documents/text.txt"
          let path=URL(fileURLWithPath: file)
          let text=try? String(contentsOf: path)
      

      【讨论】:

      • 这值得更多 +1。简单,干净,不需要NS。我错过了什么吗?如果这是有缺陷的,有人能告诉我吗?
      【解决方案3】:

      斯威夫特 4:

       let filePath = "/Users/UserName/Desktop/FolderName/FileName.txt"
       let fullPath = NSString(string: filePath).expandingTildeInPath
       do
       {
           let fileContent = try NSString(contentsOfFile: fullPath, encoding: String.Encoding.utf8.rawValue)
           print(fileContent)
       }
       catch
       {
           print(error)
       }
      

      【讨论】:

        【解决方案4】:

        使用 Atomix 的答案,这将在 Swift 4 中工作:

        let location = NSString(string: "~/test.txt").expandingTildeInPath    
        let fileContent = try? NSString(contentsOfFile: location, encoding: String.Encoding.utf8.rawValue)
        

        【讨论】:

          【解决方案5】:

          相对路径提示:

          不要这样做:
          NSString("~/file.txt").stringByExpandingTildeInPath

          您可以这样做:
          "\(NSHomeDirectory())/file.txt"

          【讨论】:

            【解决方案6】:

            这在 Swift 2.1、XCode7 中对我有用,可以获取位置并打印 CSV 的内容。 (您可以在 Text Wrangler 中创建一个简单的 CSV)

            override func viewDidLoad() {
                super.viewDidLoad()
            
                let location = NSString(string:"/Users/*Myusername*/Documents/myCSVfile.csv")
                let fileContent = try? NSString(contentsOfFile: location as String, encoding: NSUTF8StringEncoding)
                print(fileContent)
            
            }
            

            【讨论】:

            • 我还没有测试过代码,但是谢谢,这帮助我决定在启动应用程序后直接在哪里读取文件。
            【解决方案7】:

            如果你的路径中有波浪号,你可以试试这个:

            let location = "~/file.txt".stringByExpandingTildeInPath
            let fileContent = NSString(contentsOfFile: location, encoding: NSUTF8StringEncoding, error: nil)
            

            否则就使用这个:

            let location = "/Users/you/Desktop/test.txt"
            let fileContent = NSString(contentsOfFile: location, encoding: NSUTF8StringEncoding, error: nil)
            

            这为您提供了文件的字符串表示形式,我认为这是您想要的。 您可以使用NSData(contentsOfFile: location) 来获取二进制表示,但您通常会为音乐文件而不是文本文件这样做。


            更新:对于 Xcode 7 和 Swift 2,这不再适用。您现在可以使用

            let location = NSString(string:"~/file.txt").stringByExpandingTildeInPath
            let fileContent = try? NSString(contentsOfFile: location, encoding: NSUTF8StringEncoding)
            

            【讨论】:

            • 我收到此错误:`Cannot invoke initializer for type 'NSString' with an argument list of type '(contentsOfFile: String, encoding: Ulnt, error: NilLiteralConvertible)'
            • 让 location = NSString(string:"/Users/you/Desktop/myCSVfile.csv") 让 fileContent = 试试? NSString(contentsOfFile:位置为字符串,编码:NSUTF8StringEncoding)
            【解决方案8】:

            您可能会发现这个工具不仅可以在 Swift 中读取文件,还可以同时解析它:https://github.com/shoumikhin/StreamScanner

            只需像这样指定文件路径和数据分隔符(有关更多选项,请参阅readme):

            import StreamScanner
            
            if let input = NSFileHandle(forReadingAtPath: "/file/path")
            {
                 let scanner = StreamScanner(source: input, delimiters: NSCharacterSet(charactersInString: ":\n"))  //separate data by colons and newlines
            
                 while let field: String = scanner.read()
                 {
                    //use field
                 }
            }
            

            希望,这会有所帮助。

            【讨论】:

              【解决方案9】:

              这可行:

              let path = "~/file.txt"
              let expandedPath = path.stringByExpandingTildeInPath
              let data: NSData? = NSData(contentsOfFile: expandedPath)
              
              if let fileData = data {
                  let content = NSString(data: fileData, encoding:NSUTF8StringEncoding) as String
              }
              

              请注意,data 可能为零,因此您应该检查一下。

              编辑: 不要忘记有条件的展开 - 看起来好多了;)

              【讨论】:

              • 我没有得到“if let fileData = data”部分?这是怎么回事?
              • data 是可选的。它在上面的行中被声明为一个。引用本书第一章“A Swift Tour”的话:“你可以使用 if 和 let 来处理可能丢失的值。这些值表示为可选值。可选值要么包含一个值,要么包含 nil表示缺少某个值。在值的类型后写一个问号 (?) 以将该值标记为可选。"
              猜你喜欢
              • 1970-01-01
              • 2017-09-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多