xml地图|网站地图|网站标签 [设为首页] [加入收藏]
TXT文本存储
分类:编程

将数据保存到TXT文本的操作非常简单,而且TXT文本几乎兼容任何平台,但是这有个缺点,那就是不利于检索。所以如果对检索和数据结构要求不高,追求方便第一的话,可以采用TXT文本存储。本节中,我们就来看下如何利用Python保存TXT文本文件。

 

/*

1. 本节目标

本节中,我们要保存知乎上“发现”页面的“热门话题”部分,将其问题和答案统一保存成文本形式。

 

 Swith

2. 基本实例

首先,可以用requests将网页源代码获取下来,然后使用pyquery解析库解析,接下来将提取的标题、回答者、回答保存到文本,代码如下:

import requests
from pyquery import PyQuery as pq

url = 'https://www.zhihu.com/explore'
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
html = requests.get(url, headers=headers).text
doc = pq(html)
items = doc('.explore-tab .feed-item').items()
for item in items:
    question = item.find('h2').text()
    author = item.find('.author-link-line').text()
    answer = pq(item.find('.content').html()).text()
    file = open('explore.txt', 'a', encoding='utf-8')
    file.write('n'.join([question, author, answer]))
    file.write('n' + '=' * 50 + 'n')
    file.close()

这里主要是为了演示文件保存的方式,因此requests异常处理部分在此省去。首先,用requests提取知乎的“发现”页面,然后将热门话题的问题、回答者、答案全文提取出来,然后利用Python提供的open()方法打开一个文本文件,获取一个文件操作对象,这里赋值为file,接着利用file对象的write()方法将提取的内容写入文件,最后调用close()方法将其关闭,这样抓取的内容即可成功写入文本中了。

运行程序,可以发现在本地生成了一个explore.txt文件,其内容如图所示。

 

图片 1

这样热门问答的内容就被保存成文本形式了。

这里open()方法的第一个参数即要保存的目标文件名称,第二个参数为a,代表以追加方式写入到文本。另外,我们还指定了文件的编码为utf-8。最后,写入完成后,还需要调用close()方法来关闭文件对象。

/** 协议 **/

 格式: switch(需要匹配的值) case 匹配的值: 需要执行的语句 break;

3. 打开方式

在刚才的实例中,open()方法的第二个参数设置成了a,这样在每次写入文本时不会清空源文件,而是在文件末尾写入新的内容,这是一种文件打开方式。关于文件的打开方式,其实还有其他几种,这里简要介绍一下。

  • r:以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
  • rb:以二进制只读方式打开一个文件。文件指针将会放在文件的开头。
  • r+:以读写方式打开一个文件。文件指针将会放在文件的开头。
  • rb+:以二进制读写方式打开一个文件。文件指针将会放在文件的开头。
  • w:以写入方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
  • wb:以二进制写入方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
  • w+:以读写方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
  • wb+:以二进制读写格式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
  • a:以追加方式打开一个文件。如果该文件已存在,文件指针将会放在文件结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,则创建新文件来写入。
  • ab:以二进制追加方式打开一个文件。如果该文件已存在,则文件指针将会放在文件结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,则创建新文件来写入。
  • a+:以读写方式打开一个文件。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,则创建新文件来读写。
  • ab+:以二进制追加方式打开一个文件。如果该文件已存在,则文件指针将会放在文件结尾。如果该文件不存在,则创建新文件用于读写。

 

 OC:

4. 简化写法

另外,文件写入还有一种简写方法,那就是使用with as语法。在with控制块结束时,文件会自动关闭,所以就不需要再调用close()方法了。这种保存方式可以简写如下:

with open('explore.txt', 'a', encoding='utf-8') as file:
    file.write('n'.join([question, author, answer]))
    file.write('n' + '=' * 50 + 'n')

如果想保存时将原文清空,那么可以将第二个参数改写为w,代码如下:

with open('explore.txt', 'w', encoding='utf-8') as file:
    file.write('n'.join([question, author, answer]))
    file.write('n' + '=' * 50 + 'n')

上面便是利用Python将结果保存为TXT文件的方法,这种方法简单易用,操作高效,是一种最基本的保存数据的方法。

 

//// 1.定义协议

 char rank = 'A';

 

 switch (rank) {

//格式:协议的定义方式与类, 结构体, 枚举的定义非常相似

 case 'A':

protocol SomeProtocol {

 NSLog(@"优");

    //协议方法

 break;

}

 case 'B':

 

 NSLog(@"良");

//协议可以继承一个或者多个协议

 break;

protocol SomeProtocol2:SomeProtocol {

 case 'C':

    //协议定义

 NSLog(@"差");

}

 break;

 

 default:

//结构体实现协议

 NSLog(@"没有评级");

struct SomeStrure : SomeProtocol,SomeProtocol2 {

 break;

    //结构体定义

 }

}

 

 

 可以穿透

//类实现协议和继承父类, 协议一般卸载父类后面

 char rank = 'A';

class SomeSuperclass {

 switch (rank) {

    //父类定义

 case 'A':

}

 NSLog(@"优");

class SomeClass: SomeSuperclass, SomeProtocol{

 case 'B':

    

 NSLog(@"良");

    //子类定义

 break;

}

 case 'C':

 

 NSLog(@"差");

//// 2.协议的属性

 break;

// 协议不指定是否该属性应该是一个存储属性或者计算属性, 它只指定所需的名称和读写类型. 属性要求总是声明为变量属性, 用var关键字做前缀.

 default:

 

 NSLog(@"没有评级");

protocol ClassProtocol {

 break;

    static var present:Bool { get set}    //要求该属性可读可写,并且是静态的

 }

    var subject:String { get }            //要求改属性可读

 

    var stName:String { get set}          //要求该属性可读可写

 可以不写default

}

 char rank = 'A';

 

 switch (rank) {

//定义类来实现协议

 case 'A':

class MyClass : ClassProtocol {

 NSLog(@"优");

    static var present = false     //如果没有实现协议的属性要求,会直接报错

 break;

    var subject = "Swift Protocol" //该属性设置为可读可写, 也是满足协议的要求

 case 'B':

    var stName: String = "Class"

 NSLog(@"良");

    

 break;

    func attendance() -> String {

 case 'C':

        return "The (self.stName) has secured 99% attendance"

 NSLog(@"差");

    }

 break;

    

 }

    func markSScured() -> String {

 

        return "(self.stName) has (self.subject)"

 default位置可以随便放

    }

 char rank = 'E';

}

 switch (rank) {

//创建对象

 default:

var classa = MyClass()

 NSLog(@"没有评级");

print(classa.attendance())  // The Class has secured 99% attendance

 break;

print(classa.markSScured()) // Class has Swift Protocol

 case 'A':

 

 {

//// 3.协议普通方法实现

 int score = 100;

// 协议可以要求制定实例方法和类型方法被一致的类型实现. 这些方法被写为定义协议的一部分, 跟普通实例和类型方法完全一样, 但是没有大括号或方法体. 可变参数是允许的, 普通方法也遵循同样的规则, 不过不允许给协议方法参数指定默认值.

 NSLog(@"优");

 

 break;

//定义协议, 指定方法要求

 }

protocol RandomNumberGenerator {

 case 'B':

    func random() -> Double  //实现该协议, 需要实现该方法

 NSLog(@"良");

}

 break;

 

 case 'C':

class LinerCongruentialGenerator : RandomNumberGenerator {

 NSLog(@"差");

    var lastRandom = 45.0

 break;

    let m = 149998.0

 }

    let a = 24489.0

 

    let c = 29879.0

 

    

 在case中定义变量需要加大括号, 否则作用域混乱

    // 实现协议方法

 char rank = 'A';

    func random() -> Double {

 switch (rank) {

        lastRandom = ((lastRandom * a + c).truncatingRemainder(dividingBy: m)) //truncatingRemainder 替代旧方法 %

 case 'A':

        return lastRandom / m

 {

    }

 int score = 100;

}

 NSLog(@"优");

 

 break;

let generator = LinerCongruentialGenerator()

 }

print("随机数:(generator.random())")    //随机数:0.545993946585954

 case 'B':

print("再来随机数:(generator.random())") //再来随机数:0.0449539327191029

 NSLog(@"良");

 

 break;

 

 case 'C':

//// 4.协议中实现构造函数

 NSLog(@"差");

// 协议SomeProtocol中不仅可以声明方法/属性/下标, 还可以声明构造器, 但在Swift中, 除了某些特殊情况下, 构造器是不被子类继承的, 所以SomeClass中虽然能保证定义了协议要求的构造器, 但不能保证SomeClass的子类中也定义了协议要求的构造器. 所以我们需要在实现协议要求的构造器时, 使用required关键字确保SomeClass的子类也得实现这个构造器.

 break;

 

 }

protocol TcpProtocol {

 

    // 初始化构造器要求

 不能判断对象类型

    init(aprot:Int)

 NSNumber *num = @100;

}

 switch (num) {

 

 

class TcpClass: TcpProtocol {

 case @100:

    var aprot: Int

 NSLog(@"优");

    required init(aprot: Int) {

 break;

        self.aprot = aprot

 default:

    }

 NSLog(@"没有评级");

}

 break;

 

 }

var tcp = TcpClass(aprot: 20)

 */

print(tcp.aprot)

 

 

/** Swift:可以判断对象类型, OC必须是整数 **/

 

//不可以穿透

// 例子: 举个简单的例子,有一只猫和狗,他们都属于宠物,用类去实现就要这样操作,定义一个父类叫做宠物,里面有喂食和玩耍两个方法,猫和狗都继承与宠物这个父类。这样操作自然可以实现,但是要知道,猫和狗不都是宠物,这里把宠物定义成父类就不是很合适,这里应该把宠物定义成协议就相对合适很多啦

//可以不写break

 

var rank = "A"

//// 5.使用实例

switch rank{

// 宠物猫和宠物狗的例子,利用协议可以这样实现,声名个动物的父类,然后让猫和狗class都继承与动物class。在定义一个宠物的属性,里面有玩耍和喂食两个方法,让猫和狗都继承与宠物协议,实现代码如下:

    case "A":  // 相当于if

 

      print("A")

protocol Pet {

    case "B": // 相当于 else if

    func payWith()

      print("B")

    func fed(food:String)

    case "C": // 相当于 else if

}

      print("C")

 

    default:  // 相当于 else

class Animal {

      print("其他")

    var name:String = ""

}

    var birthPlace:String = ""

 

    init(name:String, birthPlace:String) {

/*

本文由澳门新葡亰手机版发布于编程,转载请注明出处:TXT文本存储

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文