Leer y escribir una cadena desde el archivo de texto

Necesito leer y escribir datos en / desde un archivo de texto, pero no he podido averiguar cómo.

Encontré este código de muestra en el iBook de Swift, pero todavía no sé cómo escribir o leer datos.

import Cocoa class DataImporter { /* DataImporter is a class to import data from an external file. The class is assumed to take a non-trivial amount of time to initialize. */ var fileName = "data.txt" // the DataImporter class would provide data importing functionality here } class DataManager { @lazy var importer = DataImporter() var data = String[]() // the DataManager class would provide data management functionality here } let manager = DataManager() manager.data += "Some data" manager.data += "Some more data" // the DataImporter instance for the importer property has not yet been created” println(manager.importer.fileName) // the DataImporter instance for the importer property has now been created // prints "data.txt” var str = "Hello World in Swift Language." 

Para leer y escribir, debe usar una ubicación que se pueda escribir, por ejemplo, el directorio de documentos. El siguiente código muestra cómo leer y escribir una cadena simple. Puedes probarlo en un patio de juegos.

Swift 1.x

 let file = "file.txt" if let dirs : [String] = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String] { let dir = dirs[0] //documents directory let path = dir.stringByAppendingPathComponent(file); let text = "some text" //writing text.writeToFile(path, atomically: false, encoding: NSUTF8StringEncoding, error: nil); //reading let text2 = String(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil) } 

Swift 2.2

 let file = "file.txt" //this is the file. we will write to and read from it let text = "some text" //just a text if let dir = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true).first { let path = NSURL(fileURLWithPath: dir).URLByAppendingPathComponent(file) //writing do { try text.writeToURL(path, atomically: false, encoding: NSUTF8StringEncoding) } catch {/* error handling here */} //reading do { let text2 = try NSString(contentsOfURL: path, encoding: NSUTF8StringEncoding) } catch {/* error handling here */} } 

Swift 3.xy Swift 4.0

 let file = "file.txt" //this is the file. we will write to and read from it let text = "some text" //just a text if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { let fileURL = dir.appendingPathComponent(file) //writing do { try text.write(to: fileURL, atomically: false, encoding: .utf8) } catch {/* error handling here */} //reading do { let text2 = try String(contentsOf: fileURL, encoding: .utf8) } catch {/* error handling here */} } 

Asumiendo que ha movido su archivo de texto data.txt a su proyecto Xcode (use arrastrar y soltar y marque “Copiar archivos si es necesario”) puede hacer lo siguiente al igual que en Objective-C:

 let bundle = NSBundle.mainBundle() let path = bundle.pathForResource("data", ofType: "txt") let content = NSString.stringWithContentsOfFile(path) as String println(content) // prints the content of data.txt 

Actualizar:
Para leer un archivo de Bundle (iOS), puede usar:

 let path = NSBundle.mainBundle().pathForResource("FileName", ofType: "txt") var text = String(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil)! println(text) 

Actualización para Swift 3:

 let path = Bundle.main.path(forResource: "data", ofType: "txt") // file path for file "data.txt" var text = String(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil)! 

Xcode 8.x • Swift 3.xo posterior

 do { // get the documents folder url if let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { // create the destination url for the text file to be saved let fileURL = documentDirectory.appendingPathComponent("file.txt") // define the string/text to be saved let text = "Hello World !!!" // writing to disk try text.write(to: fileURL, atomically: false, encoding: .utf8) print("saving was successful") // any code posterior code goes here // reading from disk let savedText = try String(contentsOf: fileURL) print("savedText:", savedText) // "Hello World !!!\n" } } catch { print("error:", error) } 

Nuevo método más simple y recomendado: Apple recomienda utilizar URL para el manejo de archivos y las soluciones anteriores parecen obsoletas (ver comentarios a continuación). La siguiente es la nueva forma simple de leer y escribir con URL (no se olvide de manejar los posibles errores de URL):

Swift 4.0 y 3.1

 import Foundation // Needed for those pasting into Playground let fileName = "Test" let dir = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) // If the directory was found, we write a file to it and read it back if let fileURL = dir?.appendingPathComponent(fileName).appendingPathExtension("txt") { // Write to the file named Test let outString = "Write this text to the file" do { try outString.write(to: fileURL, atomically: true, encoding: .utf8) } catch { print("Failed writing to URL: \(fileURL), Error: " + error.localizedDescription) } // Then reading it back from the file var inString = "" do { inString = try String(contentsOf: fileURL) } catch { print("Failed reading from URL: \(fileURL), Error: " + error.localizedDescription) } print("Read from the file: \(inString)") } 

Xcode 8, Swift 3 formas de leer el archivo desde el paquete de la aplicación:

 if let path = Bundle.main.path(forResource: filename, ofType: nil) { do { let text = try String(contentsOfFile: path, encoding: String.Encoding.utf8) print(text) } catch { printError("Failed to read text from \(filename)") } } else { printError("Failed to load file from app bundle \(filename)") } 

Aquí hay una conveniente copia y pegar Extensión

 public extension String { func contentsOrBlank()->String { if let path = Bundle.main.path(forResource:self , ofType: nil) { do { let text = try String(contentsOfFile:path, encoding: String.Encoding.utf8) return text } catch { print("Failed to read text from bundle file \(self)") } } else { print("Failed to load file from bundle \(self)") } return "" } } 

Por ejemplo

 let t = "yourFile.txt".contentsOrBlank() 

Casi siempre quieres una variedad de líneas:

 let r:[String] = "yourFile.txt" .contentsOrBlank() .characters .split(separator: "\n", omittingEmptySubsequences:ignore) .map(String.init) 

Quiero mostrarte solo la primera parte, que se lee . Así es como simplemente puede leer:

Swift 3:

 let s = try String(contentsOfFile: Bundle.main.path(forResource: "myFile", ofType: "txt")!) 

Swift 2:

 let s = try! String(contentsOfFile: NSBundle.mainBundle().pathForResource("myFile", ofType: "txt")!) 

La respuesta actual aceptada anteriormente de Adam tuvo algunos errores para mí, pero aquí es cómo reformulé su respuesta e hice que esto funcionara para mí.

 let file = "file.txt" let dirs: [String]? = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String] if (dirs != nil) { let directories:[String] = dirs! let dirs = directories[0]; //documents directory let path = dirs.stringByAppendingPathComponent(file); let text = "some text" //writing text.writeToFile(path, atomically: false, encoding: NSUTF8StringEncoding, error: nil); //reading var error:NSError? //reading let text2 = String(contentsOfFile: path, encoding:NSUTF8StringEncoding, error: &error) if let theError = error { print("\(theError.localizedDescription)") } } 

Puede encontrar esta herramienta útil no solo para leer desde un archivo en Swift sino también analizar su entrada: https://github.com/shoumikhin/StreamScanner

Simplemente especifique la ruta de archivo y los delimitadores de datos de esta manera:

 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 } } 

Espero que esto ayude.

Tuve que recodificar de esta manera:

 let path = NSBundle.mainBundle().pathForResource("Output_5", ofType: "xml") let text = try? NSString(contentsOfFile: path! as String, encoding: NSUTF8StringEncoding) print(text) 

En el ejemplo de función, (leer | escribir) DocumentsFromFile (…) tener algunos wrappers de funciones parece tener sentido, ya que todo en OSx e iOS parece necesitar tres o cuatro clases principales creadas y un conjunto de propiedades, configuradas, vinculadas, instanciado y configurado, solo para escribir “Hola” en un archivo, en 182 países.

Sin embargo, estos ejemplos no son lo suficientemente completos como para usarlos en un progtwig real. La función de escritura no informa ningún error al crear o escribir en el archivo. En la lectura, no creo que sea una buena idea devolver un error de que el archivo no existe como la cadena que se supone que contiene los datos que se leyeron. Desearía saber que falló y por qué, a través de algún mecanismo de notificación, como una excepción. Luego, puede escribir algún código que muestre cuál es el problema y le permite al usuario corregirlo, o “correctamente” rompe el progtwig en ese punto.

No querrá simplemente devolver una cadena con un “Error file not exists” en ella. Entonces, tendría que buscar el error en la cadena para llamar a la función cada vez y manejarla allí. También es posible que realmente no puedas decir si la cadena de error realmente se leyó de un archivo real, o si se produjo a partir de tu código.

Ni siquiera puede invocar la lectura de esta forma en 2.2 rápidos y Xcode 7.3 porque NSString (contentsOfFile …) arroja una excepción. Es un error de tiempo de comstackción si no tiene ningún código para atraparlo y hacer algo con él, como imprimirlo en stdout, o mejor, una ventana emergente de error o stderr. He escuchado que Apple se está alejando de la captura de prueba y las excepciones, pero va a ser un paso largo y no es posible escribir código sin esto. No sé de dónde viene el argumento & error, tal vez una versión anterior, pero NSString.writeTo [File | URL] no tiene actualmente un argumento NSError. Se definen así en NSString.h:

 public func writeToURL(url: NSURL, atomically useAuxiliaryFile: Bool, encoding enc: UInt) throws public func writeToFile(path: String, atomically useAuxiliaryFile: Bool, encoding enc: UInt) throws public convenience init(contentsOfURL url: NSURL, encoding enc: UInt) throws public convenience init(contentsOfFile path: String, encoding enc: UInt) throws 

Además, el archivo no existente es solo uno de los posibles problemas que su progtwig podría tener al leer un archivo, como un problema de permisos, el tamaño del archivo u otros muchos problemas que ni siquiera querría codificar para manejar un controlador. cada uno de ellos. Lo mejor es simplemente asumir que todo es correcto y capturar e imprimir, o manejar, una excepción si algo va mal, además, en este punto, realmente no tienes opción de todos modos.

Aquí están mis reescrituras:

 func writeToDocumentsFile(fileName:String,value:String) { let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString! let path = documentsPath.stringByAppendingPathComponent(fileName) do { try value.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding) } catch let error as NSError { print("ERROR : writing to file \(path) : \(error.localizedDescription)") } } func readFromDocumentsFile(fileName:String) -> String { let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString let path = documentsPath.stringByAppendingPathComponent(fileName) var readText : String = "" do { try readText = NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding) as String } catch let error as NSError { print("ERROR : reading from file \(fileName) : \(error.localizedDescription)") } return readText } 

Para mi archivo txt funciona de esta manera:

 let myFileURL = NSBundle.mainBundle().URLForResource("listacomuni", withExtension: "txt")! let myText = try! String(contentsOfURL: myFileURL, encoding: NSISOLatin1StringEncoding) print(String(myText)) 

Para evitar confusiones y agregar facilidad, he creado dos funciones para leer y escribir cadenas en archivos en el directorio de documentos. Aquí están las funciones:

 func writeToDocumentsFile(fileName:String,value:String) { let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! NSString let path = documentsPath.stringByAppendingPathComponent(fileName) var error:NSError? value.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding, error: &error) } func readFromDocumentsFile(fileName:String) -> String { let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! NSString let path = documentsPath.stringByAppendingPathComponent(fileName) var checkValidation = NSFileManager.defaultManager() var error:NSError? var file:String if checkValidation.fileExistsAtPath(path) { file = NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil) as! String } else { file = "*ERROR* \(fileName) does not exist." } return file } 

Aquí hay un ejemplo de su uso:

 writeToDocumentsFile("MyText.txt","Hello world!") let value = readFromDocumentsFile("MyText.txt") println(value) //Would output 'Hello world!' let otherValue = readFromDocumentsFile("SomeText.txt") println(otherValue) //Would output '*ERROR* SomeText.txt does not exist.' 

¡Espero que esto ayude!

Versión Xcode: 6.3.2

Último código de swift3
Puede leer datos del archivo de texto solo use el código abajo Este es mi archivo de texto

  { "NumberOfSlices": "8", "NrScenes": "5", "Scenes": [{ "dataType": "label1", "image":"http://is3.mzstatic.com/image/thumb/Purple19/v4/6e/81/31/6e8131cf-2092-3cd3-534c-28e129897ca9/mzl.syvaewyp.png/53x53bb-85.png", "value": "Hello", "color": "(UIColor.red)" }, { "dataType": "label2", "image":"http://is1.mzstatic.com/image/thumb/Purple71/v4/6c/4c/c1/6c4cc1bc-8f94-7b13-f3aa-84c41443caf3/mzl.hcqvmrix.png/53x53bb-85.png", "value": "Hi There", "color": "(UIColor.blue)" }, { "dataType": "label3", "image":"http://is1.mzstatic.com/image/thumb/Purple71/v4/6c/4c/c1/6c4cc1bc-8f94-7b13-f3aa-84c41443caf3/mzl.hcqvmrix.png/53x53bb-85.png", "value": "hi how ru ", "color": "(UIColor.green)" }, { "dataType": "label4", "image":"http://is1.mzstatic.com/image/thumb/Purple71/v4/6c/4c/c1/6c4cc1bc-8f94-7b13-f3aa-84c41443caf3/mzl.hcqvmrix.png/53x53bb-85.png", "value": "what are u doing ", "color": "(UIColor.purple)" }, { "dataType": "label5", "image":"http://is1.mzstatic.com/image/thumb/Purple71/v4/6c/4c/c1/6c4cc1bc-8f94-7b13-f3aa-84c41443caf3/mzl.hcqvmrix.png/53x53bb-85.png", "value": "how many times ", "color": "(UIColor.white)" }, { "dataType": "label6", "image":"http://is1.mzstatic.com/image/thumb/Purple71/v4/5a/f3/06/5af306b0-7cac-1808-f440-bab7a0d18ec0/mzl.towjvmpm.png/53x53bb-85.png", "value": "hi how ru ", "color": "(UIColor.blue)" }, { "dataType": "label7", "image":"http://is5.mzstatic.com/image/thumb/Purple71/v4/a8/dc/eb/a8dceb29-6daf-ca0f-d037-df9f34cdc476/mzl.ukhhsxik.png/53x53bb-85.png", "value": "hi how ru ", "color": "(UIColor.gry)" }, { "dataType": "label8", "image":"http://is2.mzstatic.com/image/thumb/Purple71/v4/15/23/e0/1523e03c-fff2-291e-80a7-73f35d45c7e5/mzl.zejcvahm.png/53x53bb-85.png", "value": "hi how ru ", "color": "(UIColor.brown)" }] 

}

Puede usar este código para obtener datos del archivo json de texto en swift3

  let filePath = Bundle.main.path(forResource: "nameoftheyourjsonTextfile", ofType: "json") let contentData = FileManager.default.contents(atPath: filePath!) let content = NSString(data: contentData!, encoding: String.Encoding.utf8.rawValue) as? String print(content) let json = try! JSONSerialization.jsonObject(with: contentData!) as! NSDictionary print(json) let app = json.object(forKey: "Scenes") as! NSArray! let _ : NSDictionary for dict in app! { let colorNam = (dict as AnyObject).object(forKey: "color") as! String print("colors are \(colorNam)") // let colour = UIColor(hexString: colorNam) { // colorsArray.append(colour.cgColor) // colorsArray.append(colorNam as! UIColor) let value = (dict as AnyObject).object(forKey: "value") as! String print("the values are \(value)") valuesArray.append(value) let images = (dict as AnyObject).object(forKey: "image") as! String let url = URL(string: images as String) let data = try? Data(contentsOf: url!) print(data) let image1 = UIImage(data: data!)! as UIImage imagesArray.append(image1) print(image1) } 

escribe en ViewDidLoad

 var error: NSError? var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) var documentsDirectory = paths.first as String var dataPath = documentsDirectory.stringByAppendingPathComponent("MyFolder") if !NSFileManager.defaultManager().fileExistsAtPath(dataPath) { NSFileManager.defaultManager().createDirectoryAtPath(dataPath, withIntermediateDirectories: false, attributes: nil, error: &error) } else { println("not creted or exist") } func listDocumentDirectoryfiles() -> [String] { if let documentDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as? String { let myFilePath = documentDirectory.stringByAppendingPathComponent("MyFolder") return NSFileManager.defaultManager().contentsOfDirectoryAtPath(myFilePath, error: nil) as [String] } return [] } 

Esto funciona con Swift 3.1.1 en Linux:

 import Foundation let s = try! String(contentsOfFile: "yo", encoding: .utf8) 
  func writeToDocumentsFile(fileName:String,value:String) { let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString let path = documentsPath.appendingPathComponent(fileName) do{ try value.write(toFile: path, atomically: true, encoding: String.Encoding.utf8) }catch{ } } func readFromDocumentsFile(fileName:String) -> String { let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString let path = documentsPath.appendingPathComponent(fileName) let checkValidation = FileManager.default var file:String if checkValidation.fileExists(atPath: path) { do{ try file = NSString(contentsOfFile: path, encoding: String.Encoding.utf8.rawValue) as String }catch{ file = "" } } else { file = "" } return file } 

Xcode 8.3.2 Swift 3.x. Usando NSKeyedArchiver y NSKeyedUnarchiver

Leyendo archivo de documentos

 let documentsDirectoryPathString = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! let documentsDirectoryPath = NSURL(string: documentsDirectoryPathString)! let jsonFilePath = documentsDirectoryPath.appendingPathComponent("Filename.json") let fileManager = FileManager.default var isDirectory: ObjCBool = false if fileManager.fileExists(atPath: (jsonFilePath?.absoluteString)!, isDirectory: &isDirectory) { let finalDataDict = NSKeyedUnarchiver.unarchiveObject(withFile: (jsonFilePath?.absoluteString)!) as! [String: Any] } else{ print("File does not exists") } 

Escribir archivo en documentos

 NSKeyedArchiver.archiveRootObject(finalDataDict, toFile:(jsonFilePath?.absoluteString)!)